Sql 是否可以将右外连接写入始终为空的左部分?
这是我想要的一个例子 我们有两个表-用户和部门Sql 是否可以将右外连接写入始终为空的左部分?,sql,postgresql,Sql,Postgresql,这是我想要的一个例子 我们有两个表-用户和部门 users: id name d_id 1 Alice 1 2 Bob 1 departments: id name 1 Sales 2 Support 接下来,我写下通常的右连接: SELECT u.id, u.name, d.name AS d_name FROM users u RIGHT OUTER JOIN departments d ON u.d_id = d.id 它返回: id name
users:
id name d_id
1 Alice 1
2 Bob 1
departments:
id name
1 Sales
2 Support
接下来,我写下通常的右连接:
SELECT u.id, u.name, d.name AS d_name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id
它返回:
id name d_name
-- -------- ---------
1 Alice Sales
2 Bob Sales
NULL NULL Support
是否可以编写返回下一个结果的查询
id name d_name
-- -------- ---------
1 Alice Sales
2 Bob Sales
NULL NULL Sales
NULL NULL Support
使用工会添加尚未列出的部门:
SELECT u.id, u.name, d.name AS d_name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id
UNION
SELECT NULL, NULL, d.name
FROM departments
您似乎希望联合所有:
第一个子查询不需要外部联接。Gordon Linoff使用内部联接和联合的解决方案可能比此答案中提供的正确联接和联合性能更好。除非您有特殊需要,否则请使用Gordon Linoff的答案。@mikDiet通过这种方式,我们也可以实现即使您完全回答了我的问题,我也会在暂停后接受它-您能回答更多问题吗?1是否可以使用union对查询结果排序,例如按d.id排序?申请限额/抵销?2.性能如何?我预计左表中约有10k-100k行,右表中约有1k-10k行。@MikDiet:order by 1最后为空
Select
T.id,
T.name,
CASE WHEN T.d_name IS NULL THEN d.name ELSE T.d_name END d_name
from (
SELECT
u.id,
u.name,
d.name AS d_name,
did
FROM Users u
RIGHT OUTER JOIN Departments d
ON u.did = d.id )T
FULL OUTER JOIN Departments d
ON T.did <> d.id
Select
T.id,
T.name,
CASE WHEN T.d_name IS NULL THEN d.name ELSE T.d_name END d_name
from (
SELECT
u.id,
u.name,
d.name AS d_name,
did
FROM Users u
RIGHT OUTER JOIN Departments d
ON u.did = d.id )T
FULL OUTER JOIN Departments d
ON T.did <> d.id