SQL:使用多列进行Dupe检查

时间:2011-04-12 12:22:05

标签: sql sql-server-2005 insert duplicates

我必须做一个:

INSERT INTO aaa(DateFrom, DateTo)
SELECT DateFrom, DateTo FROM bbb

但有时这个日期间隔已经存在于aaa

如何将WHERE添加到SELECT中,如果该日期间隔已存在则不插入aaa

我的问题是:如果我添加如下内容:

WHERE bbb.DateFrom NOT IN aaa.DateFrom AND bbb.DateTo NOT IN aaa.DateTo

这不会检查两个日期(间隔),而是检查“发件人”或“收件人”日期

2 个答案:

答案 0 :(得分:1)

你的插页很好,

  

INSERT INTO @aaa(DateFrom,DateTo)   SELECT b.DateFrom,b.DateTo FROM @bbb   B'/ P>

您需要摆脱现有的WHERE子句并改为执行LEFT JOIN。

  

LEFT JOIN @aaa a ON a.DateFrom =   b.DateFrom AND a.DateTo = b.DateTo

然后,您可以将其与新的WHERE子句结合使用,以测试第二个表中是否缺少条目:

  

WHERE ISNULL(a.DateFrom,'')=''

瞧,你有疑问!

下面的完整工作示例:

  

DECLARE @aaa TABLE(DateFrom   datetime,DateTo datetime)

     

INSERT INTO @aaa(DateFrom,DateTo)   价值观('2011年1月1日','2011年1月31日')   INSERT INTO @aaa(DateFrom,DateTo)   价值观('2011年3月1日','2011年3月15日')

     

SELECT * FROM @aaa

     

DECLARE @bbb TABLE(DateFrom   datetime,DateTo datetime)

     

INSERT INTO @bbb(DateFrom,DateTo)   价值观('2011年1月1日','2011年1月31日')   INSERT INTO @bbb(DateFrom,DateTo)   价值观('2011年3月1日','2011年3月16日')   INSERT INTO @bbb(DateFrom,DateTo)   价值观('2011年2月1日','2011年6月3日')

     

SELECT * FROM @bbb

     

INSERT INTO @aaa(DateFrom,DateTo)   SELECT b.DateFrom,b.DateTo FROM @bbb   b LEFT JOIN @aaa a ON a.DateFrom =   b.DateFrom AND a.DateTo = b.DateTo   在哪里ISNULL(a.DateFrom,'')=''

     

SELECT * FROM @aaa

答案 1 :(得分:0)

看起来您需要做的就是将“AND”更改为“OR”并添加嵌套的select语句。

WHERE bbb.DateFrom NOT IN (select aaa.DateFrom from aaa) AND bbb.DateTo NOT IN (select aaa.DateTo from aaa)