SQL如何仅更新第一行

Lor*_*orn 9 sql postgresql

我正在使用PostgreSQL.我有一些表格.在最后一栏中有'Y'或'N'字母.我需要命令,首先选择匹配(我的意思是最后一列为'N')并在'Y'上更改它.

我的想法:

UPDATE Table SET Checked='Y' 
WHERE (SELECT Checked FROM Table WHERE Checked='N' ORDER BY ID LIMIT 1) = 'N'
Run Code Online (Sandbox Code Playgroud)

但它在每一行都将'N'改为'Y'.

Cra*_*ger 26

为什么它不起作用

其他人则回答了如何,但你真的需要理解为什么这是错的:

UPDATE Table SET Checked='Y' WHERE (
  SELECT Checked FROM Table WHERE Checked='N' ORDER BY ID LIMIT 1
) = 'N'
Run Code Online (Sandbox Code Playgroud)

SQL以明确定义的顺序逐步评估.在这种情况下,子查询首先进行求值,因为它是不相关的,即它不引用外部查询中的任何变量.

子查询按id顺序查找第一行,其中'Checked'为'N',并且SELECT列表包含该字段Checked,这意味着子查询将替换该值N.有效地不执行任何操作(除了它可能NULL不是N,如果没有行匹配).

所以现在你有:

UPDATE Table SET Checked='Y' WHERE 'N' = 'N';
Run Code Online (Sandbox Code Playgroud)

开始看看出了什么问题?

'N' = 'N'永远都是真的.所以这个WHERE条款总是正确的,你也可以编写一个无约束的更新.

UPDATE Table SET Checked='Y';
Run Code Online (Sandbox Code Playgroud)

如何解决它

你想在第一行,其中checkedn并置checkedy.您需要使用主键连接这两个部分.找到id您要更新的内容,然后使用它来约束更新.

其他人已经写过该查询的文本,所以我在此不再重复.但是,希望你现在能理解这些答案.


小智 18

这是查询

UPDATE Table SET Checked='Y' 
WHERE ID =(SELECT ID FROM Table WHERE Checked='N' ORDER BY ID LIMIT 1) 
Run Code Online (Sandbox Code Playgroud)