2016-04-12 10 views
0

以下のフォーマットのテーブルが3つあります。クエリ3つのテーブルのデータを条件結合で表示する

select a.id,b.id1,b.id2,c.id,c.name 
from TableA a 
join TableB b on a.id = b.id1 
left join TableC on b.id2 = c.id 

Table A     Table B     Table C 
id       id1 id2     id name 
1       1 null     1.1 john 
2       1 1.1     
          2 null     

私は私の意図があった場合、私は、すなわち、結果セットの最初の行を取り除くために必要であり、以下のデータ

a.id b.id1 b.id2 c.id c.name 
1  1  null null null 
1  1  1.1 1.1 john 
2  2  null null null 

が表示されますデータがない場合はヌル行だけを表示し、ヌル行を表示する。

明快さが必要な場合は教えてください。

+1

null以外の値が複数ある場合はどうなりますか?それは可能ですか? –

+0

はい複数の非ヌル値を持つ可能性があります。その場合、すべての非NULL値を表示する必要があります。 以下の例を参照してください。 表A表B表C 識別ID1のID2 ID名 1ヌル1.1ジョン 2 1 1.1 1.2ジェリー 1つの1.2 2ヌル そして私の結果は次のようになります 1 1.1ジョン 1 1.2ジェリー 2 null null – Naresh

答えて

0

、そしてそうするとき削除した場合:私はあなたのデータのための最も簡単な方法は、集計だと思いますヌル値があります。したがって、あなたが複数の行を持っている場合には、あなたは、単一の行のすべてのあなたのid2を持つことになります

select a.id,b.id1,b.id2,c.id,c.name 
from TableA a 
join TableB b on a.id = b.id1 
left join TableC on b.id2 = c.id 
left join (
select sum(case when id2 is null then 0 else 1 end) as test, 
id1 
from TableB 
group by id1 
) AS Table_test on Table_test.id1 = b.id1 

where b.id2 is not null or Table_test.test = 0 

、なし:

select sum(case when id2 is null then 0 else 1 end) as test, 
id1 
from TableB 
group by id1 

と問合せ:

この表は次のようになりますヌル行だけを保持し、ヌル行だけを保持します。

+0

Oracle SQL Developerで同じ問合せを実行しました。しかし、以下のエラーを取得します。助けてください。 ORA-00905:キーワードがありません 00905。00000 - "missing keyword" *原因: *処置: 行のエラー:10列:11 – Naresh

+0

心配しないでください。今は動作していますが、特定のIDに対してのみクエリを実行したい場合は、さらに気になります。 たとえば、id1の名前のみを表示する場合は、 、つまりTableA.id = '1'です。 お勧めします。私がOracleを使い慣れていないので、フィルタを追加する場所はわかりません。 – Naresh

+0

'WHERE'節を次のように変更してください: ' WHERE(b.id2はnullでないかTable_test.test = 0)とa.id = 1' このクエリのすべてを理解していますか?あなたがオラクルに慣れていないなら、このクエリは@sgeddesよりも理解しやすいでしょうが、その2つはうまく機能します。そして、それが動作する場合、答えを納得させてください:) – BD01

2

私が正しく理解していない場合、ここrankを使用して一つの選択肢です:

select * 
from (
    select a.id,b.id1,b.id2,c.id,c.name, 
     rank() over (partition by b.id1 
         order by case when b.id2 is null then 1 else 0 end) rnk 
    from TableA a 
     join TableB b on a.id = b.id1 
     left join TableC on b.id2 = c.id 
) t 
where id2 is not null or rnk = 1 
0

あなたの重複がすべてTableBから来ています。これらの行には、いくつかの方法で優先順位を付けることができます。私たちは、少なくともTablebid1ためid2上の非ヌル値に存在する場合に保存し、別のテーブルを使用してソリューションを持つことができます

select a.id, b.id1, b.id2, c.id, c.name 
from TableA a join 
    (select b.id1, max(b.id2) as id2 
     from TableB b 
     group by b.id1 
    ) b 
    on a.id = b.id1 left join 
    TableC 
    on b.id2 = c.id; 
+1

これは、OPは 'tableb'から単一のレコードを返すことだけを前提としていると指摘しておきます。返される可能性のある 'tableb'に複数の非nullレコードが存在することが想定されていました。 – sgeddes

+0

@sgeddes。 。 。この点についての質問は非常にあいまいであり、このバージョンではサンプルデータを処理しています。 OPは、より多くの説明を提供する必要があります。 –

+0

テーブルBに1つのidのレコードが複数ある場合は、そのすべての非NULL値を表示する必要があります。 – Naresh

関連する問題