SQL如何根据关联表数据存在性新增Claim_YN列返回Yes/No
实现方案
注意:示例中两个表的产品ID大小写不一致(产品表为小写prod_xx,理赔表为首字母大写Prod_xx),匹配时需要先统一大小写避免匹配遗漏,若业务规则本身要求大小写敏感可去掉下文的LOWER()函数。
方式1:通用LEFT JOIN写法(兼容所有主流数据库)
适合需要同时查询两个表其他字段的场景,代码如下:
SELECT p.Product_ID, CASE WHEN c.CLAIM_PRODUCT_ID IS NOT NULL THEN 'Yes' ELSE 'No' END AS `Claim Y/N` FROM Product_Table p LEFT JOIN ( -- 先对理赔表产品ID去重+转小写,避免关联时产生重复数据 SELECT DISTINCT LOWER(CLAIM_PRODUCT_ID) AS CLAIM_PRODUCT_ID FROM Claim_Table ) c ON LOWER(p.Product_ID) = c.CLAIM_PRODUCT_ID
方式2:EXISTS子查询写法(性能更优)
不需要全表关联,理赔表数据量较大时效率更高,代码如下:
SELECT p.Product_ID, CASE WHEN EXISTS ( SELECT 1 FROM Claim_Table c WHERE LOWER(c.CLAIM_PRODUCT_ID) = LOWER(p.Product_ID) ) THEN 'Yes' ELSE 'No' END AS `Claim Y/N` FROM Product_Table p
方式3:MySQL简化写法
如果使用MySQL数据库,可以用IF函数简化判断逻辑:
SELECT p.Product_ID, IF( EXISTS(SELECT 1 FROM Claim_Table c WHERE LOWER(c.CLAIM_PRODUCT_ID) = LOWER(p.Product_ID)), 'Yes', 'No' ) AS `Claim Y/N` FROM Product_Table p
若需要直接在产品表新增物理列存储结果,执行以下两步
- 新增列:
ALTER TABLE Product_Table ADD COLUMN Claim_YN VARCHAR(3);
- 批量更新列值:
UPDATE Product_Table p SET Claim_YN = CASE WHEN EXISTS(SELECT 1 FROM Claim_Table c WHERE LOWER(c.CLAIM_PRODUCT_ID) = LOWER(p.Product_ID)) THEN 'Yes' ELSE 'No' END;
小提示:如果你的表名本身带有空格,需要按所用数据库规则包裹表名,比如MySQL用反引号
`Product Table`,SQL Server用方括号[Product Table],Oracle用双引号"Product Table"。
内容的提问来源于stack exchange,提问作者DanangFall
相关产品推荐
相关产品推荐

