如何根据key2列是否存在key1值更新flag字段?SQL语句报错求助
解决UPDATE语句中根据列值存在性更新flag的问题
你的问题出在子查询没有和外部的更新行做关联——当前的子查询SELECT * FROM dbo.WRK_DATA WHERE key1 = key2只是检查整个表中是否存在任意一行满足key1等于key2,而不是判断当前更新行的key1值是否在整个key2列中出现过。这会导致所有行的flag被设置成同一个值,显然不符合你的需求。
修正后的SQL方案
这里提供两种可靠的写法:
方案1:关联外部表的EXISTS子查询
通过在子查询中指定外部表的别名,明确关联当前行的key1:
UPDATE wd SET flag = CASE WHEN EXISTS (SELECT 1 FROM dbo.WRK_DATA sub WHERE sub.key2 = wd.key1) THEN 'Y' ELSE 'N' END FROM dbo.WRK_DATA wd;
方案2:使用IN子查询
这种写法更直观,直接判断当前行的key1是否存在于key2的集合中:
UPDATE dbo.WRK_DATA SET flag = CASE WHEN key1 IN (SELECT key2 FROM dbo.WRK_DATA) THEN 'Y' ELSE 'N' END;
验证你的示例数据
针对你给出的测试数据:
key1| key2 | Flag
20a | 10a | N
45a | 35a | Y
55a | 45a | N
45a | 35a | Y
执行修正后的SQL后,结果会完全符合预期:
- 行1的
key1=20a:key2列里没有20a,所以flag为N - 行2的
key1=45a:key2列里有45a(第三行),所以flag为Y - 行3的
key1=55a:key2列里没有55a,所以flag为N - 行4的
key1=45a:同样满足条件,flag为Y
内容的提问来源于stack exchange,提问作者Nishanth Baskaran
相关产品推荐
相关产品推荐

