【问题标题】:SQL Server How to insert multiple values while excluding repeating valuesSQL Server如何在排除重复值的同时插入多个值
【发布时间】:2021-03-02 16:52:17
【问题描述】:

我正在为一个程序开发一个查询,其中用户必须在数据库表中输入一个或多个值。

查询的问题是,当您尝试插入多个值时,可能是其中一些值在表中重复,并且警告一次只会显示一个重复值,这可能是您遇到的问题使用 1000 多个值。

错误信息:

无法在具有唯一索引“IX_StyleID_WebCategoryID”的对象“ItemWebCategory”中插入重复的键行。重复键值为 (1109068, 99999)。

查询

insert into ItemWebCategory (Style_id,WebCategoryID) 
    select distinct Style_id,WebCategoryID = '99999' 
    from ItemCategory 
    where style_id in ('1109068','168175', '68435', '545457', '69189') 

问题

如何修改查询,使其可以跳过/排除所有重复值并仅插入表中不存在的值?

【问题讨论】:

  • 使用WHERE 检查值不存在还是使用MERGE
  • WebCategoryID = '99999' 这是一个布尔字段吗?

标签: sql sql-server sql-insert


【解决方案1】:

试试这样的:

INSERT INTO ItemWebCategory ( Style_id, WebCategoryID ) 
SELECT DISTINCT 
    Style_id,
    '99999' AS WebCategoryID
FROM ItemCategory WHERE Style_id NOT IN (
    SELECT Style_id FROM ItemWebCategory
);

NOT IN 不包括 ItemWebCategory 中已存在的任何 Style_id 值。

【讨论】:

  • NOT IN 应避免使用,因为它会在可为空的列上产生不正确的结果。请改用NOT EXISTSEXCEPT
【解决方案2】:

您有两个直接的选择:

  • NOT EXISTS
insert into ItemWebCategory (Style_id,WebCategoryID) 
    select distinct Style_id,WebCategoryID = '99999' 
    from ItemCategory ic
    where style_id in ('1109068','168175', '68435', '545457', '69189') 
        AND NOT EXISTS (SELECT 1
            FROM ItemWebCategory iwc
            WHERE ic.Style_id = iwc.Style_id
        );
  • EXCEPT
insert into ItemWebCategory (Style_id,WebCategoryID) 
    select Style_id,WebCategoryID = '99999' 
    from ItemCategory
    where style_id in ('1109068','168175', '68435', '545457', '69189') 
    EXCEPT
    SELECT Style_id
    FROM ItemWebCategory;

现在不需要DISTINCT,因为EXCEPT 意味着DISTINCT

  • 一个更有用的选项是MERGE由于万圣节保护(整个主题本身)as explained by Paul White,这具有性能优势:
MERGE ItemWebCategory AS target
USING (
    select Style_id, WebCategoryID = '99999' 
    from ItemCategory
    where style_id in ('1109068','168175', '68435', '545457', '69189')
) AS source
ON target.Style_id = source.Style_id
WHEN NOT MATCHED THEN INSERT
    (Style_id, WebCategoryID)
VALUES (source.Style_id, source.WebCategoryID);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多