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)
它只是将查询发送到无限循环.
有什么建议?
提前致谢.
您可以在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)