SQL实现两表custid比对 为表1acc_exists列写入存在标识
表1 acc_exists字段匹配更新实现方案
原SQL的错误点
- 误用
INSERT语法:INSERT是用来新增数据行的,你的需求是修改表1已有行的acc_exists字段值,应该使用UPDATE语法 - 取值逻辑错误:你写的
SELECT UPPER(t1.custid)返回的是custid本身的值,不是需求要求的存在为1、不存在为0的标记值 - 缺失存在性判断:仅做了左连接,没有通过连接结果判断custid是否在表2存在
正确实现SQL
你用的是带dbo schema的语法,对应SQL Server环境,直接用关联更新即可:
UPDATE t1 SET t1.acc_exists = CASE WHEN t2.custid IS NOT NULL THEN 1 ELSE 0 END FROM dbo.customer_accounts t1 LEFT JOIN dbo.customer_details t2 ON UPPER(t1.custid) = UPPER(t2.custid)
如果偏好语义更清晰的写法,也可以用EXISTS判断,大表场景下如果custid建了索引,这个写法性能更稳定:
UPDATE dbo.customer_accounts SET acc_exists = CASE WHEN EXISTS ( SELECT 1 FROM dbo.customer_details t2 WHERE UPPER(t2.custid) = UPPER(customer_accounts.custid) ) THEN 1 ELSE 0 END
执行结果验证
针对你给出的示例数据,执行完上述SQL后,表1的数据会变成:
custid name lastname acc_exists 123456 eric john 0 54658 david peter 1
完全符合需求:custid=54658在表2存在标记为1,custid=123456在表2不存在标记为0。
注意事项
- 如果
custid字段是数值类型,不需要加UPPER()函数,该函数仅用于字符串类型custid存在大小写存储差异时做不敏感匹配 - 正式执行更新前,建议先执行下面的查询预览匹配结果,确认无误后再跑更新语句,避免误改数据:
-- 预览匹配结果 SELECT t1.custid, t1.name, t1.lastname, CASE WHEN t2.custid IS NOT NULL THEN 1 ELSE 0 END AS pre_check_acc_exists FROM dbo.customer_accounts t1 LEFT JOIN dbo.customer_details t2 ON UPPER(t1.custid) = UPPER(t2.custid)
内容的提问来源于stack exchange,提问作者edcoder
相关产品推荐
相关产品推荐

