表1
ColA ColB ColC
A 1 X
表2
ColA ColB ColD ColE
A 1 1/1/2017 No
A 1 1/2/2017 Yes
A 1 1/3/2017 Yes
期望的输出:
A 1 X 1/2/2017
寻找E ="是"。
的最早日期尝试
SELECT Table1.ColA, Table1.ColB, Table1.ColC, min(Table2.ColD) as ColD
FROM Table1
LEFT JOIN Table2
ON Table1.ColA=Table2.ColA AND Table1.ColB=Table2.ColB
WHERE Table2.ColE="Yes"
GROUP BY Table1.ColA, Table1.ColB, Table1.ColC
但我在Table1中找到了一条记录,其中ColB为空。该记录未包含在结果中。在这种情况下,ColE是一个文本字段。
试图弄清楚为什么在这个查询中省略了Table1中的行 - 为了保持Table1的完整性,只需在Table2中添加适用的列。
答案 0 :(得分:0)
你的问题的答案,“试图弄清楚为什么在这个查询中省略了Table1中的行”只是因为你加入了A列和B列。如果表1中的ColB为NULL,它就不会使用我在示例数据中看到的内容与Table2中的任何记录进行匹配,因此不会返回该记录。
答案 1 :(得分:0)
(这被标记为msaccess,我不完全确定它是如何比较null的,所以有人请在编辑我时如果我关闭那个方面。我会选择大多数数据库会做什么nulls,一些快速的谷歌搜索让我觉得这是正确的方法。)
@ wind39在评论中暗示,加入是愚蠢的。你在可选(右手)表上有一个WHERE,所以这实际上是一个内连接。你的意思是右外连接吗?或者你想要更像这样的东西?
INNER JOIN Table2
ON Table1.ColA=Table2.ColA
AND (Table1.ColB=Table2.ColB
OR (Table1.ColB is null AND Table2.ColB is null))
WHERE Table2.ColE="Yes"
即。给我Table1和Table2中的所有内容,它们在ColA上匹配,并且在ColB上匹配,除非Table1.ColB和Table2.ColB都为null。许多数据库不会直接将Null等同于自身,这就是“为空”检查的AND,并且可能是您问题的根源。
如果您确实需要Table1中的所有内容,但只需要Table2中ColE =“Yes”的那些行,那么您就不能拥有该WHERE子句。它将过滤Table1 * Table2的FINAL结果,而不仅仅是Table2连接上的行。您可以做的一件事是将其移至LEFT JOIN子句。
LEFT JOIN Table2
ON Table1.ColA=Table2.ColA
AND (Table1.ColB=Table2.ColB
OR (Table1.ColB is null AND Table2.ColB is null))
AND Table2.ColE="Yes"
根据您的数据,可能存在不同的正确解决方案,因为ColB为空时的规则在您的问题中不明显。