17

我遇到了一个由于某种原因我无法弄清楚的问题。我正在尝试编写一个连接两个表的查询,其中可能在表中找不到匹配项。如:

SELECT 
    Table1.IDField, Table2.IDField
FROM 
    Table1
LEFT OUTER JOIN 
    Table2 ON Table1.PersonID = Table2.PersonID
WHERE 
    (Table1.IDField = '12345')
    AND (Table2.Category = 'Foo')

如果 中没有匹配项Table2,则不会返回任何内容。但是,如果没有匹配项,我需要它只为该列返回一个 NULL 并且仍然从Table1.

我已经改变了JOIN我能想到的一切,但无济于事。

Table2.Category可以包含多个其他值,因此执行一种OR IS NULL交易将不起作用。

所以,如果没有匹配Table2.Category = 'Foo',我仍然需要它返回:

Table1 | Table2
----------------
 12345 |  NULL

有什么建议么?

4

3 回答 3

29

将条件 fortable2从您的WHERE子句中移到您的JOIN.

SELECT 
    Table1.IDField, Table2.IDField
FROM 
    Table1
LEFT OUTER JOIN Table2 
    ON Table1.PersonID = Table2.PersonID
    AND Table2.Category = 'Foo'
WHERE 
    Table1.IDField = '12345'
于 2013-01-04T16:33:13.300 回答
7

尝试这个:

LEFT OUTER JOIN
Table2 ON Table1.PesonID = Table2.PersonID
AND Table2.Category = 'Foo'

然后从 WHERE 子句中删除 'Foo' 行

于 2013-01-04T16:32:26.140 回答
0

问题不在于连接本身,而在于与 table2 匹配的 where 子句中的要求。我用 where coalese(table2.category, 'Foo') = 'Foo' 解决了这个问题。这样,如果 table2 为空,它仍然会匹配。

于 2013-01-04T16:34:43.327 回答