我正在使用Microsoft Access 2007,发现此SQL没有 EXCEPT 运算符。我了解到我可以使用 LEFT JOIN 和 IS NULL 来执行此操作。我几乎拥有它,但不能完全放弃它。
我有两个表,表A包含personID,foodID和timePURCHASED的数据。有身份证的人在特定时间购买身份证食物。表B是其中的一个子集。 (它选择了表A中的行。)
我的目标是:表A除了表B.
表A
PERSONID foodID timePURCHASED
1 1 2/6/2012 1:00:00 PM
1 4 2/6/2012 6:00:00 PM
2 3 2/7/2012 8:00:00 PM
3 1 2/6/2012 9:00:00 PM
3 3 2/6/2012 4:00:00 PM
表B
PERSONID foodID timePURCHASED
1 1 2/6/2012 1:00:00 PM
3 3 2/6/2012 4:00:00 PM
目标
PERSONID foodID timePURCHASED
1 4 2/6/2012 6:00:00 PM
2 3 2/7/2012 8:00:00 PM
3 1 2/6/2012 9:00:00 PM
这是我开始的代码:
SELECT A.personID, A.foodID, A.timePURCHASED
FROM A
LEFT JOIN B ON (A.personID = B.personID)
WHERE ((B.personID) Is Null);
据我所知,这会导致我的GOAL表没有任何匹配的personID(1,3)并留下personID不匹配(2)。我知道我需要同时考虑所有三个列,并发现我可以在 LEFT JOIN 中使用 AND 运算符:
SELECT A.personID, A.foodID, A.timePURCHASED
FROM A
LEFT JOIN B ON (A.personID = B.personID)
AND (A.foodID = B.foodID)
AND (A.timePURCHASED = B.timePURCHASED)
WHERE (((B.personID) Is Null)
AND ((B.foodID) Is Null)
AND ((B.timePURCHASED) Is Null));
到目前为止,这还没有奏效,我正在寻找一些建议。我为格式TLDR道歉,或者这是否更容易回答。我是新手,学习SQL。感谢您的帮助。
答案 0 :(得分:2)
您的第二个查询通常看起来不错。但是,您不需要所有3 IS NULL
个检查,因为您的输入集中没有任何空值。你也可以摆脱所有这些括号。
SELECT A.personID, A.foodID, A.timePurchased
FROM A
LEFT JOIN B
ON A.personID = B.personID
AND A.foodID = B.foodID
AND A.timePurchased = B.timePurchased
WHERE B.personID is null;
这在我根据您的规范设置的全新数据库中完美地工作(意味着它完全输出您指定的“目标”关系),但您的第二个查询也是如此。
所以似乎设置必定是错误的,而不是SQL本身。这两个表的CREATE TABLE
语句是什么样的?具体来说,您要比较的数据类型是什么?引擎盖下的timePURCHASED
列字符串是什么?如果是这样,他们有空格吗?一个表是否有字符串,另一个DATETIME
是什么?至于Terje D.的观点,正是是你所看到的结果?