2017-02-02 8 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'などのクエリの結果を(unionを使って)並べ替えることは可能ですか?リミット/オフセットを適用しますか? 2)パフォーマンスはどうですか?私は、左のテーブルで約10k-100k行、右に1k-10k行を期待しています。 – MikDiet

+0

@MikDiet:「最後に1つのヌルで最後に」 –

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

「INNER JOIN」と「UNION ALL」を使用したGordon Linoffのソリューションは、この回答で提供されている「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

関連する問題