SQL同表更新指定行EID:现有语句返回错误值,求正确写法
问题描述
现有Test_Table表,数据如下:
EID Hold Source 3232 KLME jame.k@gmail.com KLME https://google.com EEME david.e@gmail.com JJIN Test@gmail.com 7232 JJIN https://google.com
需要将Hold为“KLME”的第二行的EID,更新为同Hold下第一行的EID值(即3232),期望结果如下:
EID Hold Source 3232 KLME jame.k@gmail.com 3232 KLME https://google.com EEME david.e@gmail.com 7232 JJIN Test@gmail.com 7232 JJIN https://google.com
编写的UPDATE语句执行后得到错误结果(覆盖为其他用户的EID),语句如下:
UPDATE Test_Table SET EID = ( SELECT TOP 1 Test_Table.EID FROM Test_Table WHERE Test_Table.Hold = Test_Table.Hold AND Test_Table.EID <> '' OR Test_Table.EID <> NULL )
请问该如何修正?
问题分析与解决
你的SQL存在三个核心问题:
- 自引用混淆:子查询中
Test_Table.Hold = Test_Table.Hold是同表同字段的无意义比较,永远为真,无法关联到当前待更新行的Hold分组。 - 空值判断错误:
NULL不能用<> NULL判断,必须用IS NOT NULL;同时AND与OR优先级混乱,导致筛选逻辑失效。 - 未限定更新范围:原语句会更新所有行的
EID,而非仅目标分组下的空值行。
针对KLME分组的修正语句(SQL Server环境)
UPDATE t1 SET t1.EID = ( SELECT TOP 1 t2.EID FROM Test_Table t2 WHERE t2.Hold = t1.Hold AND t2.EID IS NOT NULL AND t2.EID <> '' ) FROM Test_Table t1 WHERE t1.Hold = 'KLME' AND (t1.EID IS NULL OR t1.EID = '')
语句说明
- 用表别名
t1(待更新行)和t2(查询源行)区分自引用,确保子查询仅提取当前行同Hold分组下的有效EID。 - 用
IS NOT NULL和EID <> ''精准筛选有有效值的参考行。 - 外层
WHERE限定仅更新Hold='KLME'且EID为空/空字符串的行,避免误修改其他数据。
如果需要批量补全所有Hold分组下的空EID(比如示例中JJIN的行也需要补全),可去掉外层的Hold='KLME'条件:
UPDATE t1 SET t1.EID = ( SELECT TOP 1 t2.EID FROM Test_Table t2 WHERE t2.Hold = t1.Hold AND t2.EID IS NOT NULL AND t2.EID <> '' ) FROM Test_Table t1 WHERE t1.EID IS NULL OR t1.EID = ''
内容的提问来源于stack exchange,提问作者aasenomad
相关产品推荐
相关产品推荐

