我有一个存储过程,它使用游标,每次获取一个重复项SELECT,一次确定找到的 ID 数量 ( SELECT COUNT(ID) FROM TableA WHERE something.. @cur_var),如果该值COUNT(ID)大于指定值,则为UPDATE另一个表发出一个,WHERE使用上述 ID ( SELECT ID FROM TableA WHERE something.. @cur_var) 。
这个想法是将其SELECT存储在变量中(伪代码idlist = SELECT COUNT(ID) FROM TableA WHERE something.. @cur_var)。然后在(伪代码length(idlist)中使用该列表的长度。在这种情况下,在语句 (再次伪代码,)中再次使用该列表IFIF>100WHEREUPDATE TableB SET value = @cur_var WHERE ID IN idlist
我希望足够具体,我想将 a 的结果保存SELECT在变量中。然后使用结果WHERE IN variable和变量中的行数在IF.
使用 Microsoft SQL Server Enterprise Edition …
某些更新在大型 Postgres 表上花费的时间太长。鉴于这些条件:
...您可能会认为,相对于使用 Bitlocker 旋转媒体的预期,更新将花费合理的时间。我们不会创建更多数据,因此不需要在 HDD 上移动现有数据,只需覆盖它即可。其他索引应该不需要更改。等等,相反,经过20个小时不断的硬盘磨练,我厌倦了等待,停止了查询。如果我删除其他列上的所有索引并重新运行查询,则只需要大约 30 分钟。
为什么与此查询无关的列上的索引会使更新时间膨胀?
静态游标不允许修改数据,因为它是只读的,并且当使用“Where current of”执行时,它会按预期返回错误。到目前为止,一切都很好。但我惊讶地发现静态游标允许使用这样的变量修改数据。
DECLARE @nome varchar(100), @salario int,@idemp int
DECLARE contact_cursor CURSOR STATIC FOR
SELECT empno,ename, sal FROM emp
OPEN contact_cursor;
FETCH NEXT from contact_cursor into @idemp,@nome, @salario
WHILE @@FETCH_STATUS=0
BEGIN
If @salario < 5000
Update Emp
Set Sal = Sal * 1.1
where empno=@idemp --No error and do the update
--Where current of contact_cursor; --gives error
print @nome+' '+cast(@salario as varchar(100));
Run Code Online (Sandbox Code Playgroud)
FETCH NEXT from contact_cursor into @idemp,@nome, @salario
END
CLOSE contact_cursor;
DEALLOCATE contact_cursor;
Run Code Online (Sandbox Code Playgroud)
问题是:在这次更新中使用“where current”和用光标提取的变量有什么区别? 我有一个查询,我尝试插入一条记录并准备更新以防记录存在。
问题是我想知道,一旦执行查询,该操作是更新还是插入。
任何想法?
在我的 SQL Server 数据库中,我想更新多行的列。我只能为一行做:
UPDATE theTable
SET theColumn = case
WHEN id = 1 then 'a'
WHEN id = 2 then 'b'
WHEN id = 3 then 'c'
WHERE id in (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
如何在同一查询中更新更多列(theColumn2、theColumn3...)?
我在 PostgreSQL 10 数据库product中有一个jsonb名为“元数据”的列的表。这是我第一次使用文档和 Postgres。jsonb值看起来像这样:
{
"name": "l33t 衬衫",
“价格”:“1200”,
"数量": "60",
“选项” :
{
“类型”:“收音机”,
"title": "颜色",
“选择”:[
{“价值”:“红色”,“价格”:“-100”,“数量”:“30”},
{“价值”:“蓝色”,“价格”:“+200”,“数量”:“10”},
{“价值”:“绿色”,“价格”:“+300”,“数量”:“20”}
]
}
}
两个问题:
1.如何选择“opts”数组中的特定元素?
select metadata->'options'->'opts'->(element here) from product
where metadata->'options'->'opts' @> '[{"value" : "blue"}]'
Run Code Online (Sandbox Code Playgroud)
2 、当售出一件或多件时,如何更新“数量”(减去当前的“数量”)?
对指南/注释的进一步链接表示赞赏。
我最近在 Postgres 中遇到了这种奇怪的行为。我有一张像下面这样的表:
sasdb=# \d emp_manager_rel
表“db3004db.emp_manager_rel”
专栏 | 类型 | 整理 | 可空 | 默认
------------+--------+-----------+------------+----- ----
emp_id | bigint | | |
manager_id | bigint | | |
select * from emp_manager_rel ;
emp_id | manager_id
--------+------------
1 | 123
我执行了以下更新语句:
更新1:
更新 emp_manager_rel 设置 manager_id = manager_id+emp_id , emp_id=emp_id*4;
更新表格如下:
emp_id | manager_id
--------+------------
4 | 124
更新 2:我执行了以下查询(在原始表上,而不是在更新表上)
更新 emp_manager_rel 设置 emp_id=emp_id*4 , manager_id = manager_id+emp_id ;
它更新表格如下:
emp_id | manager_id
--------+------------
4 | 124
我期望 …
在SELECT查询中
SELECT b.id, MIN(IFNULL(a.views,0)) AS counted
FROM table1 a JOIN table2 b ON a.id=b.id GROUP BY id
HAVING counted>0
Run Code Online (Sandbox Code Playgroud)
我怎么能拒绝此查询UPDATE作为
UPDATE b.number = counted
Run Code Online (Sandbox Code Playgroud) 对于作为存储过程一部分的 UPDATE 语句,我在测试/生产之间看到 2 个非常不同的查询计划。显然表大小不同(大约有 1000 万行差异)。基本上区别在于 Prod 我看到一组昂贵的排序,然后是索引更新(nc 索引)
而在测试中,我根本没有看到这些运算符集!只有聚集索引更新。我已经验证了 NC 索引存在等等。我不知道发生了什么?!我已经验证了索引、sp,我试过重新编译,参数的不同值等等。肯定有我遗漏的东西,我什至检查了约束,一切都匹配。
有什么想法吗?我以前从未见过这个。SQL 是否只是抓住了一个糟糕的执行计划!?
UPDATE 的结构是这样的:UPDATE [tablename] SET [column]=123 FROM ...
update ×10
sql-server ×4
mysql ×3
postgresql ×3
performance ×2
count ×1
cursors ×1
group-by ×1
index ×1
insert ×1
join ×1
json ×1
locking ×1
query ×1
sql-standard ×1
t-sql ×1