2016-09-18 6 views
0

外部結合、右外部結合および完全外部結合リターンを残したレコードの数を見つけることは可能ですか?左手側のテーブルと右手側のテーブルと一致するレコードのレコード数を考えると、外部結合、右外部結合および完全外部結合リターンを残したレコードの数を見つける

私はそれらの間の関係船を相関させようとしています。私はサンプルデータを入力する2つのテーブルを試しました。彼らの間に関係船を得ることができませんでした。 左手側のテーブルの一致しないエントリの数を知っているかどうか。その番号を一致するレコードに追加して、左の外部結合出力を取得します。私が右手側の不一致のレコードの数を知っている場合、そのレコードをそのレコードに追加します。右の外部結合出力が得られます。

不一致のレコードを知らなくても可能ですか?外部結合、外部外部結合、完全外部結合の戻り値を残したレコードの数を見つけることはできますか?

CREATE table table1(
    id integer, 
    name varchar(40)   
); 

CREATE table table2(
     id integer, 
    name varchar(40)   
); 

insert into table1(id,name)values(1,'ABC'); 
insert into table1(id,name)values(2,'DEF'); 
insert into table1(id,name)values(3,'GHI'); 
insert into table1(id,name)values(4,'JKL'); 
insert into table1(id,name)values(5,'JKL'); 
insert into table1(id,name)values(6,'JKL'); 

insert into table2(id,name)values(2,'ABC'); 
insert into table2(id,name)values(2,'ABC'); 
insert into table2(id,name)values(1,'ABC'); 
insert into table2(id,name)values(1,'ABC'); 
insert into table2(id,name)values(3,'ABC'); 
insert into table2(id,name)values(3,'ABC'); 
insert into table2(id,name)values(4,'ABC'); 
insert into table2(id,name)values(4,'ABC'); 
insert into table2(id,name)values(5,'ABC'); 
insert into table2(id,name)values(5,'ABC'); 

insert into table2(id,name)values(11,'ABC'); 
insert into table2(id,name)values(12,'ABC'); 
insert into table2(id,name)values(13,'ABC'); 
insert into table2(id,name)values(14,'ABC'); 
select count(*) from table1;//6 
select count(*) from table2; //14 

select count(*) from table1 inner join table2 
on table1.id=table2.id; //10 

select count(*) from table1 left outer join table2 
on table1.id=table2.id;//11 


select count(*) from table1 right outer join table2 
on table1.id=table2.id;//14 

select count(*) from table1 full outer join table2 
on table1.id=table2.id;//15 


//Unmatched records`enter code here` 
select count(*) from table1 left outer join table2 
on table1.id=table2.id 
where table2.id is null;//1 

select count(*) from table1 right outer join table2 
on table1.id=table2.id 
where table1.id is null;//4 
+0

これは、単一のクエリまたは3つの異なるクエリで必要ですか? –

+1

私はその質問を理解していません。異なる結合タイプを使用して取得できるレコードの数を示しています。また、一致のないレコードをカウントする方法も示しています。それであなたはまだ何を探していますか? –

+0

これらの番号を取得する唯一の方法は、JOINクエリを実行することです。 FULL JOINを実行して3つすべてを一度に取得します。 – Serg

答えて

0

が一致しないレコードの数は同等です一致したレコードの数を知る。 (恐らく!)

あなたの質問に対する答えは、いいえ、一致したレコードの数がわからなくても、基本テーブルのカーディナリティを知るだけで、異なるタイプの結合のレコード数を判断することはできません)。シンプルなメンタルエクササイズ:両方のテーブルに100レコードあります。すべてが完全に1対1でマッチすると、すべての結合は内部結合と同じになり、それらはすべて100個のレコードを持ちます。一致するものがまったくない場合、インナー・ジョインはゼロのローを持ち、片側のジョインは100のローを持ち、完全な外部のジョインは200のローを持ちます。これらのケースの唯一の違いは、一致した(または一致しない)レコードの数です。この情報なしで答えを得ることができることは、あなたが知っていることはまったくありません。 「一致しているレコード数」だけでなく、とにかく定義され、かつ不十分されていません知っている事実

:OPは、フォローアップの質問をした後

が追加されました。両方のテーブルのすべてのレコードが一致しているとします。 1つの極端な場合、一致がペアになることがあります。両方の表にid列があり、両方の表の値はすべて1から100までの可能な値です。結果は100行です。一方、 "id"がどちらのテーブルでも一意でないとします。代わりに、値は1つのすべての100の行の両方のテーブルにあります。最初のテーブルのすべての行は、2番目のテーブルのすべての行と一致し、結果セットは100 x 100 = 10,000の行を持ちます。

これは、次のように示唆しています。「一致する行の数」は明確な概念ではありません。 (異なる種類の)結果の結合の数を得るには、結合が何であるか、結合条件の各タプルについて、各テーブル内のその特定のタプルを持つ行の数を知る必要があります。次に、内部結合の結果セット内の行数は、そのようなタプルグループ化されたカウントの積の合計と、外部結合用の左(または右または両方)テーブルからの不一致行の追加行です。

+0

一致するレコードがわかっていても、どのようにしてco関係を導くことができるとします。テーブルAは100レコード、テーブルBは200レコード、一致レコードはAとBの間の150レコードです。外部結合を残したレコードの数、右外部結合と完全外部結合の戻り値クエリ。 – nag

0

表2のidは一意ではありませんが、table1のIDは一意です。
私はtable2.idがtable1.idの外部キーだと推測しています。その場合

、FULLでこのSQLのためのカウントを組み合わせることができ、JOINマッチと比類のない:あなたが知っている、レコードの合計数を知っているので

select 
count(distinct case when t2.id is null then t1.id end) as total_unmatched_t1, 
count(case when t1.id is null then t2.id end) as total_unmatched_t2, 
count(distinct case when t2.id is not null then t1.id end) as total_matched_t1, 
count(case when t1.id is not null then t2.id end) as total_matched_t2 
from table1 t1 
full outer join table2 t2 on (t1.id = t2.id);