2017-02-02 13 views
3

這是我想要的一個例子。是否有可能寫正確的外部連接,它總是空的左邊部分?

我們有2個表 - 用戶和部門

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 

回答

6

你似乎想UNION ALL

SELECT u.id, u.name, d.name AS d_name 
FROM users u JOIN 
    departments d 
    ON u.d_id = d.id 
UNION ALL 
SELECT NULL, NULL, d.name 
FROM departments d 
ORDER BY id NULLS LAST; 

有沒有需要外連接爲第一個子查詢。

+0

雖然你回答了我的問題(我將在超時後接受) - 你能回答更多問題嗎? 1)是否可以使用'd.id'命令查詢結果(使用聯合)?應用限制/抵消? 2)性能如何?我預計左表中有10k-100k行,右邊是1k-10k行。 – MikDiet

+0

@MikDiet:'最後一個空值的順序' –

3

使用UNION來添加未列入尚未部門:

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 
+0

Gordon Linoff使用'INNER JOIN'和'UNION ALL'的解決方案可能比在此答案中提供的'RIGHT JOIN'和'UNION'更好。除非你有特殊需要,否則請使用Gordon Linoff的答案。 – Serge

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 
+0

@mikDiet這樣我們也可以實現 – mohan111

相關問題