SQL Server插入EXCEPT而不从表中进行选择



我想使用将一些人插入到用户表中

INSERT INTO [MyTable] (col2, col3)  
VALUES ('Jim', 'Bob'),
('Stinky', 'Pete'),
('Old', 'Frank')

如果这些条目已经存在,我不希望输入它们(有一个ID列,但这里的唯一性应该由这两列的组合决定

如果我从表格中选择这些值,我可以使用(我认为(:

INSERT INTO [MyTable] (col2, col3)
SELECT [Name1], [Name2] 
FROM [ExistingTable]
EXCEPT 
SELECT [col2], [col3] 
FROM [MyTable]

那么,当我的数据还不在表中时,我该如何执行EXCEPT子句呢?

首先,您应该让数据库验证唯一性:

create unique index unq_mytable_id on mytable(id);

如果id已经被声明为主键,那么就不需要这样做了——大概应该是.

然后,您可以使用values():包含一个列表

INSERT INTO [MyTable] (col2, col3)
SELECT v.*
FROM (VALUES ('Jim','Bob'), ('Stinky','Pete'), ('Old','Frank')
) v(col2, col3)
EXCEPT
SELECT col2, col3
FROM mytable;

当然,NOT EXISTS也可以,但这更接近于您最初的查询。

您可以将ctenot exists:一起使用

with cte as (
select t.*
from ( values ('Jim','Bob'), ('Stinky','Pete'), ('Old','Frank') 
) t(col2, col3)
)
INSERT INTO [MyTable] (col2,col3)
select c.col2, c.col3
from cte c
where not exists (select 1 from mytable t where t.col2 = c.col2 and t.col3 = c.col3);

最新更新