基于子查询中是否存在完整记录更新列值
SQL更新#t1表qual_code_flag列的正确写法
你之前用t1.* IN (子查询)的语法错误,因为IN子句要求右侧返回单列数据,而t1.*返回所有列,不符合语法规则。以下是两种可行的解决方案,均能实现你的需求:
方案1:使用EXISTS结合CASE语句
通过EXISTS直接判断当前#t1记录是否存在符合条件的#t3匹配项,逻辑清晰高效:
UPDATE #t1 SET qual_code_flag = CASE WHEN EXISTS ( SELECT 1 -- 仅判断存在性,用SELECT 1比SELECT *更高效 FROM #t3 WHERE #t3.code = #t1.code AND (#t3.qual_state IS NULL OR #t3.qual_state = #t1.astate) ) THEN 'yes' ELSE 'no' END
方案2:使用LEFT JOIN关联更新
通过左连接关联两张表,根据是否匹配成功设置flag:
UPDATE t1 SET qual_code_flag = CASE WHEN t3.code IS NOT NULL THEN 'yes' ELSE 'no' END FROM #t1 t1 LEFT JOIN #t3 t3 ON t3.code = t1.code AND (t3.qual_state IS NULL OR t3.qual_state = t1.astate)
补充说明
- 两种写法都能实现你期望的结果:7条记录中6条设为'yes',1条设为'no'
- 若#t3中存在多条匹配同一#t1记录的数据,EXISTS只会判断一次存在性,LEFT JOIN会产生重复匹配,但由于设置的是固定值,最终结果一致
- 优先推荐方案1,在判断存在性场景下,EXISTS的执行效率通常更优
内容的提问来源于stack exchange,提问作者DizzleBeans
相关产品推荐
相关产品推荐

