有问题的三个表是:
表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)
但是,此查询始终返回空集。
有人可以向我解释一下我做错了什么吗?
答案 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
或更改标准=
,我认为这样可行。