如果不存在,Sql会插入多行

use*_*462 8 sql sql-server insert

我有一个sql表,其中有两列id和name.我有大约20个名字的列表,我需要编写一个查询,在插入之前检查名称是否存在.

有没有更好的方法来做这个而不是只是具有以下查询20次但具有不同的名称(我需要在t-sql中执行此操作):

IF NOT EXISTS(SELECT* 
              FROM   mytable 
              WHERE  name = 'Dan') 
  BEGIN 
      INSERT INTO mytable 
                  (name) 
      VALUES     ('dan') 
  END 
Run Code Online (Sandbox Code Playgroud)

Dav*_*ugg 5

我认为您可以使用合并语句:

MERGE INTO myTable AS Target
USING (VALUES ('name1'),('name2'),('...')) AS source (NAME)
ON Target.NAME = Source.NAME
WHEN NOT MATCHED BY TARGET THEN
INSERT (NAME) VALUES (name)
Run Code Online (Sandbox Code Playgroud)


Pre*_*red 5

您可以使用以下方式过滤值NOT EXISTS

INSERT INTO myTable (
    Name
)
SELECT DISTINCT
    Name
FROM (
        VALUES ('Name 1'),
               ('Name 2')
    ) AS NewNames(Name)
WHERE
    NOT EXISTS (SELECT 1 FROM TargetTable WHERE myTable.Name = NewNames.Name)
Run Code Online (Sandbox Code Playgroud)

如果您的新名称位于另一张表中,则可以更改上一张表中的选择查询。

请注意,关键字DISTINCT对于过滤掉源数据中的重复项是必需的。


Ral*_*adt 5

INSERT INTO MyTable (Name)
SELECT  NewNames.Name
FROM    ( VALUES ('Name1'), ('Name2'), ('Name3') ) AS NewNames (Name)
WHERE   NOT EXISTS ( SELECT 1
                     FROM   MyTable AS MT
                     WHERE  MT.Name = NewNames.Name );
Run Code Online (Sandbox Code Playgroud)