SQL LEFT JOIN在多列上为空

时间:2013-02-10 22:35:41

标签: sql ms-access-2007 left-join

我正在使用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。感谢您的帮助。

1 个答案:

答案 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.的观点,正是是你所看到的结果?