2017-03-24 7 views
0

同じテーブルの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 

を試してみました。しかし、それは結果はまだ authsclaimsの両方のために 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であるので、これは私が欲しいものではありません完全外部はすべての行どんなリターンに参加していない

おかげ

+0

適切な 'where'節を使用して実行できると思います。私の答えを見てください。 –

答えて

0

このお試しください:。!

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 
where coalesce(auths.source, 'auths') = 'auths' 
    and coalesce(claims.source, 'claims') = 'claims' 

これは基本的にはwhere句を追加したステートメントです。

関連する問題