我有一个SQL查询,其中我需要有多个条件,其中一个表中的记录在结果中加入。
具体来说,如果它的外键值与另一个表中的id相同,我需要包含一个记录 - 如果外键值为NULL,则需要包含该记录。
所以,这就是我现在所拥有的......
SELECT
table1.value1,
table1.value2,
table2.value1
FROM
dbo.table1 table1
INNER JOIN dbo.table2 table2
ON table1.table2_id = table2.id
WHERE table1.value1 = 'blah'
哪个工作正常。但是,我还需要返回table1中的所有值,其中table1.table2_id为NULL。
到目前为止,我已经尝试过这个......
SELECT
table1.value1,
table1.value2,
table2.value1
FROM
dbo.table1 table1
INNER JOIN dbo.table2 table2
ON table1.table2_id = table2.id OR table1.table2_id is NULL
WHERE table1.value1 = 'blah'
它只是将查询发送到无限循环。
有什么建议吗?
提前致谢。
答案 0 :(得分:5)
您可以在JOIN
子句中使用单独的条件,但您的方案并不适用于此。您的条件是,如果table1.table2_id为NULL,则表2中的所有行与之匹配 - 这不是一个无限循环,但可能会相当大。
可能最容易使用LEFT JOIN
从table1
返回所有行,然后使用WHERE
子句过滤为匹配或为空的行:
SELECT
table1.value1,
table1.value2,
table2.value1
FROM table1 table1
LEFT OUTER JOIN dbo.table2 table2 ON
table1.table2_id = table2.id
WHERE
table1.value1 = 'blah'
AND (table2.id IS NOT NULL OR table1.table2_id IS NULL)
您还可以使用UNION
:
SELECT
table1.value1,
table1.value2,
table2.value1
FROM table1 table1
INNER JOIN dbo.table2 table2 ON
table1.table2_id = table2.id
WHERE
table1.value1 = 'blah'
UNION ALL
SELECT
table1.value1,
table1.value2,
NULL
FROM table1 table1
WHERE
table1.value1 = 'blah'
AND table1.table2_id IS NULL
答案 1 :(得分:1)
您可以使用LEFT JOIN来获取表1中的所有记录,并且它将为表2中无法匹配的任何值返回NULL。
SELECT
table1.value1,
table1.value2,
table2.value1
FROM
dbo.table1 table1
LEFT JOIN dbo.table2 table2
ON table1.table2_id = table2.id
WHERE table1.value1 = 'blah'