2

我正在使用 Microsoft Access 2007,发现此 SQL 没有EXCEPT运算符。我了解到我可以使用LEFT JOINIS NULL来执行此操作。我几乎拥有它,但不能完全把我的拇指放在它上面。

我有两个表,表 A 有 personID、foodID 和 timePURCHASED 的数据。有身份证的人在特定时间购买身份证的食物。表 B 是其中的一个子集。(它从表 A 中选择了行。)

我的目标是做:表 A 除了表 B。

表 A

personIDfoodIDtimePURCHASED             
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

personIDfoodIDtimePURCHASED             
1            1         2/6/2012 1:00:00 PM       
3            3         2/6/2012 4:00:00 PM       

目标

personIDfoodIDtimePURCHASED             
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。感谢您提供任何帮助。

4

1 回答 1

2

您的第二个查询通常看起来不错。但是,您不需要所有 3IS 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列是字符串吗?如果是这样,它们中是否有空格?一张桌子有字符串,另一张有DATETIMEs 吗?在 Terje D. 看来,您看到的结果究竟是什么?

于 2013-02-10T23:54:47.717 回答