【问题标题】:Sql insert multiple rows if not existssql如果不存在则插入多行
【发布时间】:2023-03-21 17:13:01
【问题描述】:

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

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

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

【问题讨论】:

  • 您要排除、存储的名称列表在哪里?
  • 现在就在一封电子邮件中。需要是tsql 不能使用导入工具
  • 可以用名字作为参数吗?
  • 你可以,我如何让它检查姓名列表?
  • 你可以试试INSERT INTO mytable ... WHERE Name NOT IN ('<Name1>', '<Name2>', '<Name3>'...)

标签: sql sql-server insert


【解决方案1】:
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 );

【讨论】:

  • from 子句中的值数量是否有限制?能达到数百万吗?
【解决方案2】:

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

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)

【讨论】:

    【解决方案3】:

    您可以使用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)
    

    如果您的新名称在另一个表中,您可以更改上面的选择查询。

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

    【讨论】:

    • 它对我有用!如果有人试图对多列的表做同样的事情,你可以这样做: INSERT INTO myTable ( name, code ) SELECT DISTINCT name, code FROM ( VALUES ('Name 1','Code 1'), ('Name 2 ','Code2') ) AS NewNames(name, code) WHERE NOT EXISTS (SELECT 1 FROM myTable m WHERE m.name = NewNames.name)
    【解决方案4】:

    我会使用insert

    with names as (
          select 'Dan' as name union all
          select 'name2' union all
          . . .
         )
    insert into myTable(name)
        select distinct name
        from myTable
        where not exists (select 1 from mytable t2 where t2.name = t.name);
    

    注意:您可能希望在 mytable(name) 上创建唯一索引,以便数据库检查重复项。

    【讨论】:

      【解决方案5】:

      未经测试,可能会有一些小错误:

      merge into mytable x
      using (
          values ('name1')
               , ('name2')
               , ...
               , ('namen')
      ) as y (name)
          on x.name = y.name
      when not matched then 
          insert (name)
          values (y.name)
      

      【讨论】:

        【解决方案6】:
        INSERT INTO MyTable (Name)
        SELECT Name FROM
        (
            VALUES ('Name 1'),
                   ('Name 2')
        ) AS Names(Name)
        WHERE Name NOT IN
        (
            SELECT Name FROM MyTable
        )
        

        【讨论】:

          【解决方案7】:

          INSERT IGNORE INTO myTable (column1, column2) VALUES (val1, val2),(val3,val4),(val5,val6);

          INSERT IGNORE 将允许跳过重复值

          【讨论】:

          猜你喜欢
          • 2018-09-17
          • 1970-01-01
          • 1970-01-01
          • 2012-12-17
          • 1970-01-01
          • 2021-02-19
          • 1970-01-01
          • 1970-01-01
          • 2011-07-14
          相关资源
          最近更新 更多