显示第三个表中不存在的两个表中的公共值

时间:2016-02-03 15:42:54

标签: sql-server tsql

有问题的三个表是:

表A - 相关列是TimeTicket和IdAddress 表B - 相关列是CommunicationNumber,TimeCreate和IdAddress。 表C - 相关列是CommunicationNumber,LastCalled,NextCall

表C由IdAddress

上的TableA和TableB的连接创建
INSERT INTO tblC ([CommunicationNumber], [LastCalled] ,[NextCall])
SELECT T2.CommunicationNumber, T2.TimeCreate, T1.TimeTicket
FROM tblA T1
INNER JOIN tblB T2
ON T1.IdAddress = T2.IdAddress AND T2.CommunicationNumber IS NOT NULL

这是该过程的一部分,那很好。

现在,当表A和表B中有新数据时,我想更新表C中的数据条目。但是,我想忽略表A和表B中已经输入表C的值。

为了达到这个目的,我使用了NOT EXISTS并写了一个看起来像这样的查询。

INSERT INTO tblC ([CommunicationNumber], [LastCalled] ,[NextCall])
SELECT T2.CommunicationNumber, T2.TimeCreate, T1.TimeTicket
FROM tblA T1
INNER JOIN tblB T2
ON T1.IdAddress = T2.IdAddress AND T2.CommunicationNumber IS NOT NULL
WHERE NOT EXISTS (SELECT T3.CommunicationNumber
                    FROM [dbo].[tblPhoneLogRep] T3
                    WHERE T1.TimeTicket <> T3.NextCall AND T2.TimeCreate <> T3.LastCalled AND T2.CommunicationNumber <> T3.CommunicationNumber)

但是,此查询始终返回空集。

有人可以向我解释一下我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

尝试使用EXCEPT设置运算符:

INSERT INTO tblC ([CommunicationNumber], [LastCalled] ,[NextCall])
SELECT T2.CommunicationNumber, T2.TimeCreate, T1.TimeTicket
FROM tblA T1
INNER JOIN tblB T2
ON T1.IdAddress = T2.IdAddress AND T2.CommunicationNumber IS NOT NULL
EXCEPT
SELECT CommunicationNumber, LastCalled, NextCall FROM tblC

要修复现有查询,您需要将<>运算符更改为=运算符,如下所示:

INSERT INTO tblC ([CommunicationNumber], [LastCalled] ,[NextCall])
SELECT T2.CommunicationNumber, T2.TimeCreate, T1.TimeTicket
FROM tblA T1
INNER JOIN tblB T2
ON T1.IdAddress = T2.IdAddress AND T2.CommunicationNumber IS NOT NULL
WHERE NOT EXISTS (SELECT 1
                    FROM tblC
                    WHERE T1.TimeTicket = tblC.NextCall AND T2.TimeCreate = tblC.LastCalled AND T2.CommunicationNumber = tblC.CommunicationNumber)

就个人而言,我认为EXCEPT语法更清晰。

答案 1 :(得分:1)

您的问题是您实际上使用的是双阴性。您说的是NOT EXISTS,并且您将WHERE条件设置为<>。如果您使用EXISTS或更改标准=,我认为这样可行。