T-SQL中IF EXISTS与WHERE结合INSERT INTO的使用问题求助
解决INSERT INTO结合WHERE条件批量插入并避免重复的问题
需求说明
为Tbl_OrderDetails表中所有拥有OrderID=50的CustID添加OrderID=100的新行,仅当该CustID未存在OrderID=100的记录时才执行插入。
原代码问题分析
IF EXISTS仅判断表中是否存在OrderID=50的行,无法定位到具体需要处理的CustID集合VALUES子句中的CustID未指定来源,SQL无法识别该变量- 未做重复校验,会导致已存在
OrderID=100的CustID被重复插入
解决方案
方案1:INSERT...SELECT + NOT EXISTS(通用型,支持多数数据库)
INSERT INTO Tbl_OrderDetails (CustID, OrderID) SELECT DISTINCT CustID, 100 FROM Tbl_OrderDetails WHERE OrderID = 50 AND NOT EXISTS ( SELECT 1 FROM Tbl_OrderDetails AS t WHERE t.CustID = Tbl_OrderDetails.CustID AND t.OrderID = 100 );
SELECT DISTINCT CustID, 100:筛选出所有拥有OrderID=50的CustID,通过DISTINCT避免同一CustID因多条OrderID=50记录被重复选中NOT EXISTS子句:校验当前CustID是否已存在OrderID=100的记录,仅当不存在时才会执行插入
方案2:MERGE语句(适用于SQL Server、Oracle等支持MERGE的数据库)
MERGE INTO Tbl_OrderDetails AS target USING ( SELECT DISTINCT CustID FROM Tbl_OrderDetails WHERE OrderID = 50 ) AS source ON (target.CustID = source.CustID AND target.OrderID = 100) WHEN NOT MATCHED THEN INSERT (CustID, OrderID) VALUES (source.CustID, 100);
- 通过
MERGE匹配源数据(拥有OrderID=50的CustID)和目标表记录,仅当目标表中无对应CustID+OrderID=100的记录时,执行插入操作
执行效果验证
执行上述任意代码后,CustID=3和CustID=4会新增OrderID=100的记录,CustID=5因已存在对应记录不会重复插入,最终结果与预期一致。
内容的提问来源于stack exchange,提问作者Ariel
相关产品推荐
相关产品推荐

