我正在使用PostgreSQL.我有一些表格.在最后一栏中有'Y'或'N'字母.我需要命令,首先选择匹配(我的意思是最后一列为'N')并在'Y'上更改它.
我的想法:
UPDATE Table SET Checked='Y' 
WHERE (SELECT Checked FROM Table WHERE Checked='N' ORDER BY ID LIMIT 1) = 'N'
但它在每一行都将'N'改为'Y'.
Cra*_*ger 26
其他人则回答了如何,但你真的需要理解为什么这是错的:
UPDATE Table SET Checked='Y' WHERE (
  SELECT Checked FROM Table WHERE Checked='N' ORDER BY ID LIMIT 1
) = 'N'
SQL以明确定义的顺序逐步评估.在这种情况下,子查询首先进行求值,因为它是不相关的,即它不引用外部查询中的任何变量.
子查询按id顺序查找第一行,其中'Checked'为'N',并且SELECT列表包含该字段Checked,这意味着子查询将替换该值N.有效地不执行任何操作(除了它可能NULL不是N,如果没有行匹配).
所以现在你有:
UPDATE Table SET Checked='Y' WHERE 'N' = 'N';
开始看看出了什么问题?
'N' = 'N'永远都是真的.所以这个WHERE条款总是正确的,你也可以编写一个无约束的更新.
UPDATE Table SET Checked='Y';
你想在第一行,其中checked被n并置checked到y.您需要使用主键连接这两个部分.找到id您要更新的内容,然后使用它来约束更新.
其他人已经写过该查询的文本,所以我在此不再重复.但是,希望你现在能理解这些答案.
小智 18
这是查询
UPDATE Table SET Checked='Y' 
WHERE ID =(SELECT ID FROM Table WHERE Checked='N' ORDER BY ID LIMIT 1) 
| 归档时间: | 
 | 
| 查看次数: | 34079 次 | 
| 最近记录: |