仅当表中不存在两个 id 的组合时才将值插入表中

Posted

技术标签:

【中文标题】仅当表中不存在两个 id 的组合时才将值插入表中【英文标题】:Insert values into table only if a combination of two id's don't already exist in the table 【发布时间】:2017-01-12 16:34:10 【问题描述】:

我想在表格中插入一堆列信息。

例如

INSERT INTO TABLE 
       (AID, BID, CID, INT) 
SELECT AID, BID, CID 
FROM   ANOTHERTABLE 
WHERE  X

我想在我的插入中添加一个子句:仅当 AID 和 BID 不存在于同一行时才插入。

我无法执行where != AID,因为 AID 存在于不同的行中,同一行具有不同的 BID。

不过,我确实需要保留 AIB 和 BID 的一种组合。

因此我只是不想在同一行上重复 AIB 和 BID 行。

我试过 where rowA != AID AND rowB != BID 但这意味着表中不存在 AID 和 BID 的第一行。我只需要 AID 和 BID 的一种组合。

【问题讨论】:

查看WHERE NOT EXISTS 那么 AID 和 BID 形成一个复合键? 不是真的,我只有一个界面,它通过 AID 和另一个属性向用户显示,例如在 BID 中完成的培训,我不希望这些在我的界面中重复。 查看这个答案:***.com/a/29688738/122139 【参考方案1】:

此解决方案使用WHERE EXISTS NOT() 检查目标表中的两个值。

如果 AID 或 BID 可以具有 NULL 值,则应使用 ISNULL() 处理。

INSERT INTO TABLE 
    (AID, BID, CID, INT) 
SELECT 
    AID, BID, CID  -- problem here - where is value for INT?
FROM ANOTHERTABLE 
WHERE NOT EXISTS
    (
        SELECT 
            AID, BID
        FROM TABLE
        -- WHERE TABLE.AID & BID ... Wrong (thank you Gareth Lyons)
           WHERE TABLE.AID = ANOTHERTABLE.AID 
             AND TABLE.BID = ANOTHERTABLE.BID
    )

【讨论】:

& 不是 SQL Server 中的连接运算符,而是按位比较。所以它会在字符串上失败并在数字数据上给出不正确的答案。也没有给出数据类型,所以你不知道串联会起作用。连接也有其他问题,例如可能排除使用适当的索引。请改用 TABLE.AID = ANOTHERTABLE.AID AND TABLE.BID = ANOTHERTABLE.BID。

以上是关于仅当表中不存在两个 id 的组合时才将值插入表中的主要内容,如果未能解决你的问题,请参考以下文章

仅当记录不存在时才将 SQL 插入表中[重复]

Access97:如果不存在则插入

查找第三个表中不存在的两个表的组合

仅当两个表中都存在员工时才从临时表中更新员工 ID

从表内连接中删除 - ORA-00933:SQL 命令未正确结束

仅当复合主键尚不存在时,如何批量插入行? [AWS 红移]