首页 > 解决方案 > SQL 从 2 个不相关的表中插入一个表并且不存在

问题描述

我可以运行下一个 sql 脚本一次,使用来自 2 个不相关表的信息插入一些行:

INSERT INTO CompanyCarType (Name, CompanyId, LastModDateTime, LastModUserId)
    SELECT T.Name,  C.Id , GETDATE() LastModDateTime, C.LastModUserId
    FROM CarType T 
    CROSS JOIN Company C

但是,我需要能够多次运行此脚本而不会插入重复项,或者在我的情况下失败,因为该表不允许重复CompanyIdName.

所以我尝试使用WHERE NOT EXISTS,但是由于语句中有2个表SELECT,我不能使用别名来引用它,并且语法不正确。

INSERT INTO CompanyCarType (Name, CompanyId, LastModDateTime, LastModUserId)
    SELECT T.Name,  C.Id , GETDATE() LastModDateTime, C.LastModUserId
    FROM CarType T 
    CROSS JOIN Company C)  AS T1
    WHERE NOT EXISTS (SELECT Name
                      FROM CompanyCarType T2
                      WHERE T2.Name = T1.Name)

有很多在 SELECT 子句中使用一个表的愚蠢示例,但没有一个使用 2 个或更多表的示例。

谢谢!

标签: sql-serversql-insertnot-exists

解决方案


您可以在插入时使用行号,然后在 where not exists 子句中添加公司 ID。

INSERT INTO CompanyCarType 
(Name, CompanyId, LastModDateTime, LastModUserId)
SELECT T.Name,  C.Id , GETDATE() LastModDateTime, C.LastModUserId, ROW_NUMBER() over (partition by t.name, c.ID order by LastModDateTime) rownum 
FROM CarType T CROSS JOIN Company C)  as T1
WHERE t1.rownum = 1 and  NOT EXISTS(SELECT Name
                    FROM CompanyCarType T2
                   WHERE T2.Name = T1.Name and t2.CompanyId = t1.ID)

推荐阅读