2017-10-12 6 views
0

リビジョン番号に基づいてさまざまなテーブルからデータを抽出しようとしていますが、リビジョン番号が一致していない場合でもプライマリテーブルの最小リビジョン未満の値しか表示しません。一致するか利用できません。まだnullが表示されます。ここヌルとして不一致を返す方法

T1 
Id t1_Value Rev 
1 ABC 123 
2 XYZ 234 
3 RTY 344 
4 MGH 678 

T2 
T2Id t1_Id(FK) t2_Value Rev 
1 1  ab12 121 
2 1  qw12 122 
3 2  rf45 234 
4 3  ty67 345 


Output: 
Id T1_Value T2_Value 
1 ABC  ab12 
1 ABC  qw12 
2 XYZ  rf45 
3 RTY 
4 MGH 

私のクエリの一部です:

select t1.id, t1.value as t1_value, t2.value as t2_value 
from t1, t2 
where t1.id=t2.t1_id(+) 
and nvl(t2.rev,-1)<=t1.rev 

私がNVLを使用する場合、それは#1,2,4を返します。しかし、私は#3を返す方法を理解できません。私の現在のクエリは#3を落としているので、#3の行は表示されません。いくつかの回答を見た後、私のデータが複数のテーブルにまたがっていることを付け加えたいと思います。少なくとも10個のテーブルに対して、改訂チェック< = t1.revを行う必要があります。

答えて

0

外部結合にANSI(SQL標準)構文を使用した方がずっと良いでしょう。

推奨されていない、推奨されていない独自のOracle構文を使用しているため、NVLは必要なものではありません。私はあなたがしたいと考えてい

and t2.rev(+) <= t1.rev 
+0

でも、同じテーブルを複数回結合することはできますか?他のテーブルについても同じリビジョン番号のチェックがあります。 – Skn

+0

この新しい質問は、元の投稿で質問したものとどのように関連していますか?そうです:はい、同じテーブルに複数回アウタージョインすることができます。しかし、それはあなたの問題によって決まります。クエリがこれよりも複雑な場合は、SQL標準構文(外部の結合を少なくとも20年間は推薦しています)で定義する必要があります。 – mathguy

+0

質問に記載したようにこれは新しいものではありません私は複数のテーブルに渡ってデータを抽出していますが、私はその質問にクエリの一部しかリストしていません。はい、私はすべてのテーブルのリビジョンチェックを持って、私は Skn

0

:だけでなく、第二の条件で、t2.t1_id(+)のように、1つだけでなく、時間 -

はその代わりに、第二のテーブルから何かのEVERY発生後(+)表記法を必要とします:

select t1.id, t1.value as t1_value, t2.value as t2_value 
from t1 left join 
    t2 
    on t1.id = t2.t1_id and t2.rev <= t1.rev; 
+0

私はこれを試して、それが動作しますが、t2から値を返しますt2.rev> t1.revこの場合、どのようにnullを返すのですか? – Skn

+0

@Skn。 。 。 '> ='を使いたいかもしれません。どのフィルタリングが本当に必要なのか、あなたの質問からは分かりません。 –

関連する問題