你能做一个有多个INNER JOIN条件的SQL INNER JOIN语句吗?

时间:2016-02-24 21:12:05

标签: sql sql-server join

我有一个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'

它只是将查询发送到无限循环。

有什么建议吗?

提前致谢。

2 个答案:

答案 0 :(得分:5)

您可以在JOIN子句中使用单独的条件,但您的方案并不适用于此。您的条件是,如果table1.table2_id为NULL,则表2中的所有行与之匹配 - 这不是一个无限循环,但可能会相当大。

可能最容易使用LEFT JOINtable1返回所有行,然后使用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'