2009-09-23 18 views
-4

私はテーブルを結合する際に問題が発生した(左結合) TABLE1:SQLクエリ問題

id1 amt1 
1 100 
2 200 
3 300 

表2:

id2 amt2 
1 150 
2 250 
2 350 

私のクエリ: 選択ID1、AMT1、ID2、TABLE1 からamt2テーブル2.id1 = table1.id2に左結合テーブル2

私の想定するo/pは:

 id1 amt1 id2 amt2 
row1: 1 100 1 150 
row2: 2 200 2 250 
row3: 2 200 2 350 

私は

2ヌル2 350

すなわちとしてROW3中のO/Pをしたい私は(AMT1) 友人が助けてデータのrepetetionを避けたいです!

+0

質問を書式設定して判読できるようにしばらく時間をとってください... –

+0

-1昨日の回答ではなく、同じ質問を再度投稿してください。 http://stackoverflow.com/questions/1459993/problem-with-joining-db-tables/1460064#1460064 – APC

答えて

1

LEADとLAGを使用すると、oracleの前後の行にアクセスできます。

SELECT id1, decode(amt1, lag(amt1) over (order by id1, id2), '', amt1) amt1, 
     id2, amt2 
FROM table1 left join table2 on table2.id1=table1.id2 
ORDER BY id1, id2 

クエリの順序とラグ関数の順序は同じでなければなりません。

説明:
電流AM1が(所定の順序で前の)先行AMT1と同じである場合、値を省略します。

EDITあなたのコメントによれば、IDの変更について追加のチェックを追加します。

SELECT id1, 
     decode(id1, lag(id1) over (order by id1, id2), 
      decode(amt1, lag(amt1) over (order by id1, id2), '', amt1), 
      amt1) amt1, 
     id2, amt2 
FROM table1 left join table2 on table2.id1=table1.id2 
ORDER BY id1, id2 

同じLAG機能を使用して、IDの変更を確認します。式はもう少し複雑ですが、それはネストされたif文に匹敵します。

+0

thnx男だと思います... – user2392858

+0

あなたはその働きを思うなら、答えを記入してください。それはあなたにも評判をもたらします。 – Christian13467

+0

こんにちはあなたの質問workd 4 me。しかし、私は問題がある場合でも、idが異なっていても金額は同じです。 urクエリでは、NULLに設定されています...私はもともとテーブル数のジョインを持つプロシージャでこれを使用しています – user2392858

1

TABLE1から明確な ID1、AMT1、ID2、amt2を選択するには、これを試して?table2.id1 = table1.id2

にtable2の参加を左に