我遇到了一个我出于某种原因无法弄清楚的问题。我正在尝试编写一个连接两个表的查询,其中可能在表中找不到匹配项。如:
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
有什么建议吗?
答案 0 :(得分:24)
将table2
条件移出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'
答案 1 :(得分:7)
试试这个:
LEFT OUTER JOIN
Table2 ON Table1.PesonID = Table2.PersonID
AND Table2.Category = 'Foo'
然后从WHERE子句中删除'Foo'行
答案 2 :(得分:0)
问题不在于连接本身,而在于与table2匹配的where子句中的要求。我用coalese(table2.category,'Foo')='Foo'来解决这个问题。这样,如果table2为null,它仍将匹配。