2011-05-06 38 views
24

我有2个表如下:返回行,如果记录不存在LEFT OUTER JOIN

Table_1 
[Group No] [Test No] [Description] 
123  1   [First Test] 
123  2   [Second Test] 
123  3   [Third Test] 

Table_2 
[Sample No] [Test No] [Result Description] 
ABC   1   [Some More Result] 
ABC   3   [Some Result] 
DEF   1   [A Result] 
DEF   2   [Results More] 
DEF   3   [Bad Results] 

这里是我的查询:

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description] 
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No] 
WHERE (Table_1.[Group No] = '123') AND (Table_2.[Sample No] = 'ABC') 

djacobson的查询:

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description] 
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No] 
WHERE (Table_1.[Group No] = '123') 
    AND (Table_2.[Sample No] IS NULL OR Table_2.[Sample No] = 'ABC') 

这将返回:

[Group No] [Test No] [Description] [Result Description] 
123  1   [First Test] [Some More Result] 
123  3   [Third Test] [Some Result] 

但我真正想要的是:

[Group No] [Test No] [Description] [Result Description] 
123  1   [First Test] [Some More Result] 
123  2   [Second Test] NULL 
123  3   [Third Test] [Some Result] 

这可能吗?我想用测试2号返回记录。但是,如何加入不存在的记录?或者这是不可能的?有什么选择?

回答

42

尽管正确使用了外部联接,但您仍然将结果集限制为Table_2中存在值的情况,方法是在WHERE子句中包含该表中的一列。如果你想记录中,其中样品编号为ABC,或者出现在TABLE_2没有记录,你需要这样做:

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description] 
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No] 
WHERE (Table_1.[Group No] = '123') 
    AND (Table_2.[Sample No] IS NULL OR Table_2.[Sample No] = 'ABC') 

或者,你可以加入到它的时候(从TABLE_2过滤其结果,在这种情况下,读得更干净一点):

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description] 
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No] AND Table_2.[Sample No] = 'ABC' 
WHERE (Table_1.[Group No] = '123') 

这应该完成同样的事情。这里重要的一点是,WHERE子句过滤连接表的结果。如果您正在使用外部连接,但想要在外部连接的表上进行筛选,则必须处理连接较远处不存在任何记录的情况。

+0

嗨djacobson,这仍然产生相同的结果,我仍然没有得到与测试2号的行。这是与JOIN有关吗? – KayBee 2011-05-06 16:07:32

+0

这很奇怪...现在正在使用什么查询?请编辑您的问题以包含它(您可以在问题中使用源代码格式,但不能在评论中使用)。 – 2011-05-06 16:09:28

+0

嗨djacobson,第二个查询似乎已经产生了所需的结果。我编辑了我的原始问题,包括您建议的第一个查询 - 这不起作用,但第二个查询已经完成。 – KayBee 2011-05-06 16:15:54