同じテーブルの2つの別個のサブセットに対して完全な外部結合を行いたいと思いますが、CTEまたはサブクエリを記述することなくこれを行うことを望んでいました。私はこのようになり、データを持っている:完全な外部結合同じテーブルの2つのサブセットへの結合(Postgres 9.5)
with test as
(
select
'auths' as source,
'a1' as source_id,
'peter' as name
union all
select
'auths' as source,
'a1' as source_id,
'lauren' as name
union all
select
'claims' as source,
'c1' as source_id,
'lauren' as name
union all
select
'claims' as source,
'c3' as source_id,
'Jeff' as name
)
この結果は、何かのようになりますので、ここでの考え方は、「authsに」それを呼び出す、私はこの表の2つのソースを持っているということです
source source_id name
auths a1 peter
auths a1 lauren
claims c1 lauren
claims c3 Jeff
と"クレーム"。この特定の例では、ソースが「auths」と「claim」である両方の行に「lauren」という名前が表示されます。ピーターという名前は「auths」にのみ表示され、Jeffという名前は「クレーム」にのみ表示されます。
サブセットがsource
の値で定義され、結合条件がname
で指定されているテーブルの2つのサブセットで完全外部結合を行いたいとします。例えば、所望の結果が
name auths_source auths_source_id claims_source claims_source_id
peter auths a1
lauren auths a1 claims c1
Jeff claims c3
ように見える
select
coalesce(auths.name, claims.name) as name,
auths.source as auths_source,
auths.source_id as auths_source_id,
claims.source as claims_source,
claims.source_id as claims_source_id
from (select * from test where source = 'auths') as auths
full outer join (select * from test where source = 'claims') as claims
on auths.name = claims.name
と基本的考え方は、一致があるとき、それは同じ行に格納されることをです。一致しない場合は、2つの別々の行として格納されます。
サブクエリを使用せずにこれを行う方法があるのだろうかと思っていました。例えば、私は
select
coalesce(auths.name, claims.name) as name,
auths.source as auths_source,
auths.source_id as auths_source_id,
claims.source as claims_source,
claims.source_id as claims_source_id
from test as auths
full outer join test as claims
on auths.source = 'auths'
and claims.source = 'claims'
and auths.name = claims.name
を試してみました。しかし、それは結果はまだ
auths
と
claims
の両方のために
test
ですべてを返します、完全外部結合ですので、これは動作しません。例えば、結果がこれから返されます。
name auths_source auths_source_id claims_source claims_source_id
peter auths a1
lauren auths a1 claims c1
lauren claims c1
Jeff claims c3
peter auths a1
Jeff claims c3
lauren auths a1
値が値がauths
ですので、これが起こっているclaims_source
ためclaims
(似ているところ余分な行がauths_source
であるので、これは私が欲しいものではありません完全外部はすべての行どんなリターンに参加していない
おかげ
適切な 'where'節を使用して実行できると思います。私の答えを見てください。 –