【问题标题】:Is there a way to write an insert statement with string_split which ignores duplicates?有没有办法用忽略重复的 string_split 编写插入语句?
【发布时间】:2019-07-19 12:30:19
【问题描述】:

我正在尝试使用 string_split 命令将行插入到表中。如果没有重复,它工作正常。但是,如果有重复,则会出错。我想知道如何修改下面的内容,以便在它已经存在时跳过。

我已经尝试修改下面的插入语句,但如果遇到重复,它只会跳过整个插入语句。

BEGIN 
     IF NOT EXISTS (select * from table_a
         where column_a = @module
         and column_b in (select value from string_Split(@client_ids, ',')))
    BEGIN
        INSERT IGNORE INTO table_a (column_a, column_b)
        SELECT @module, value FROM string_Split(@client_ids, ',') 
    END
END

原始查询...

DECLARE @client_ids VARCHAR(1000);
SET @client_ids = '12345,12346,456789,789459' 
DECLARE @module int = 741852 

-- Insert statement
INSERT INTO table_a (column_a, column_b)
SELECT @module, value FROM string_Split(@client_ids, ',') 

希望帮助澄清一下... table_a 中有一堆客户端,其中许多都附加了不同的模块。

即客户端 123456 将具有模块 789,788,799,客户端 123455 将具有模块 789,788。

我的任务是列出 50 个客户端模块 799。我只想更新尚未与该模块关联的客户端。我可以查询一个已经拥有它们的列表,然后使用 excel 或其他东西来比较并清除列表,然后对没有它的列表运行查询(我昨天做了一个快速解决),但是我希望有一种更好的方法可以一步完成。

【问题讨论】:

  • 标记您的数据库名称。
  • 您在 column_a 或 column_b 的哪一列上设置了唯一键??
  • 您在 SQL Server 中使用 MySQL 构造 (INSERT IGNORE)?
  • 是的,有一种方法——使用MERGE

标签: sql sql-server tsql split sql-insert


【解决方案1】:

你可以使用SELECT DISTINCT:

INSERT INTO table_a (column_a, column_b)
    SELECT DISTINCT @module, value
    FROM string_Split(@client_ids, ',') ;

编辑:

哦,您想防止插入表中的行。也使用NOT EXISTS。如果您只是检查value,那么:

INSERT INTO table_a (column_a, column_b)
    SELECT DISTINCT @module, value
    FROM string_Split(@client_ids, ',') s
    WHERE NOT EXISTS (SELECT 1
                      FROM table_a a
                      WHERE @module = a.column_a AND
                            s.value = a.column_b
                     );

【讨论】:

  • 谢谢。由于重复,添加 DISTINCT 仍然会出错。违反 UNIQUE KEY 约束。无法在对象“dbo.table_a”中插入重复键。重复键值为 (741852, 12345)。声明已终止。
  • 再次感谢。在第二个查询建议中......同样的事情发生在我上面的IF NOT EXISTS 查询中。它只是跳过所有内容并通过。
  • 作为 Gordon siad,您可能必须更改最后一行中的 where 条件以检查从 WHERE s.value = a.column_bWHERE s.value = a.column_b and a.column_a = @module 的对
猜你喜欢
  • 1970-01-01
  • 2020-05-03
  • 2020-01-03
  • 2021-05-21
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
相关资源
最近更新 更多