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

Tim*_*ell 0 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'
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.但是,我还需要返回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'
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

提前致谢.

Mar*_*ett 5

您可以在JOIN子句中使用单独的条件,但您的方案并不适用于此.你的条件是,如果table1.table2_id是NULL,那么table2中的所有行都匹配它 - 这不是一个无限循环,但可能会相当大.

可能最容易使用a LEFT JOIN来返回所有行table1,然后使用WHERE子句过滤为匹配或为null 的子句:

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)
Run Code Online (Sandbox Code Playgroud)

你也可以使用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
Run Code Online (Sandbox Code Playgroud)