我想使用将一些人插入到用户表中
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
也可以,但这更接近于您最初的查询。
您可以将cte
与not 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);