データを返す式を考えると、次のようになります。
select
column1 id,
column2 selected
from (values (2 , 4),(3, 5)) table1;
id | selected
----+----------
2 | 4
3 | 5
(2 rows)
select
column1 id,
column2 rejected
from (values (1 , 12),(3, 13)) table2
dbornside-# ;
id | rejected
----+----------
1 | 12
3 | 13
(2 rows)
通常の内部結合では、正しい結果が得られません。両方の関係の行のみが表示されます
select * from
(select column1 id, column2 selected from (values (2 , 4),(3, 5)) table1) table1
join (select column1 id, column2 rejected from (values (1 , 12),(3, 13)) table2) table2
on table1.id = table2.id;
id | selected | id | rejected
----+----------+----+----------
3 | 5 | 3 | 13
(1 row)
右側のテーブルからすべての行を取得するには、が必要です。right outer join
左側の行はleft outer join
;です。両方を取得するには、:を使用しfull outer join
ます
select *
from (select column1 id, column2 selected from (values (2 , 4),(3, 5)) table1) table1
FULL OUTER JOIN ( select column1 id, column2 rejected from (values (1 , 12),(3, 13)) table2) table2
on table1.id = table2.id;
id | selected | id | rejected
----+----------+----+----------
2 | 4 | |
3 | 5 | 3 | 13
| | 1 | 12
(3 rows)
しかし、これは少し奇妙に見えます。これは、が;table1.id
と同じ列ではないためです。table2.id
また、特定の値が両方のテーブルに存在しないだけです。同じステップでそれらをまとめることができますcoalesce()
:
select COALESCE(table1.id, table2.id) id,
selected,
rejected
from (select column1 id, column2 selected from (values (2 , 4),(3, 5)) table1) table1
full outer join ( select column1 id, column2 rejected from (values (1 , 12),(3, 13)) table2) table2
on table1.id = table2.id;
id | selected | rejected
----+----------+----------
2 | 4 |
3 | 5 | 13
1 | | 12
(3 rows)