プロが教えるわが家の防犯対策術!

なんども、恐縮です。
Oracle[10g]のSQL文についての質問です。(新No.3)
実は、JOINが多くてどこに[ROW_NUMBER]を入れれば良いのか解りません。

[A]テーブルに
[CODE](KEY) [CODE2] のフィールドがあります。
A-1 B-1
A-2 B-2
A-3 B-3
[A2]テーブルに
[CODEB](KEY) [CODE2] のフィールドがあります。
AA-1 B-1
AA-2 B-2
AA-3 B-3
[B]テーブルに
[CODE3](KEY) [NAME-B] のフィールドがあります。
B-1 NAME-B-1
B-2 NAME-B-2
[C1]テーブルに
[NO](KEY) [LINE](KEY) [CODE] [CODEB]のフィールドがあります。
X 1 A-1 AA-2
X 2 A-3 AA-1
Y 1 A-2 AA-3
[C2]テーブルに
[NO](KEY) [LINE](KEY) [LINE2](KEY) [BIKO] のフィールドがあります。
X 1 1 BIKO-1
X 1 2 BIKO-2
結果が
[NO/LINE/CODE/CODEB/NM1/NM2/BIKO]
X 1 A-1 AA-2 NAME-B-1 NAME-B-2 BIKO-1
X 2 A-3 AA-1 (null) NAME-B-1 (null)

と、なる様にしたいのです。
要するに、のBIKOは、[C2.LINE2]の一番最小の物を取得したいのです。

SELECT C1.NO, C1.LINE, C1.CODE, C1.CODEB, B.NAMEB AS NM1, B_1.NAMEB AS NM2,
C2.LINE2, C2.BIKO
FROM ((((C1
LEFT JOIN A ON C1.CODE = A.CODE)
LEFT JOIN B ON A.CODE2 = B.CODE3)
LEFT JOIN A2 ON C1.CODEB = A2.CODEB)
LEFT JOIN B B_1 ON A2.CODE2 = B_1.CODE3)
LEFT JOIN C2 ON (C1.LINE = C2.LINE) AND (C1.NO = C2.NO)
WHERE (((C1.NO)='X'))
ORDER BY C1.NO, C1.LINE, C2.LINE2;

と、考えたのですが、結果が
X 1 A-1 AA-2 NAME-B-1 NAME-B-2 1 BIKO-1
X 1 A-1 AA-2 NAME-B-1 NAME-B-2 2 BIKO-2
X 2 A-3 AA-1 (null) NAME-B-1(null)(null)
と、出てしまいます。
どうすれば良いのでしょうか ?
宜しくお願い致します。

A 回答 (2件)

ちゃんと理解しないうちに、なぜ質問を閉じるんですか?


前回のディスカッションの成果は何処へ行ってしまったのですか?

そもそも、C2に邪魔なデータがあるのが問題なだけなんだから、
それを排除すれば良いはずです。

LEFT JOIN C2 ON (C1.LINE = C2.LINE) AND (C1.NO = C2.NO)

LEFT JOIN (select C2.*,row_number() over(partition by no,line order by line2) r from C2) C2
ON (C1.LINE=C2.LINE AND C1.NO=C2.NO and r=1)
    • good
    • 0
この回答へのお礼

>ちゃんと理解しないうちに、なぜ質問を閉じるんです
>か?
申し訳ございません。前回の質問に関しては、解決と
思い閉じました。

>そもそも、C2に邪魔なデータがあるのが問題なだけな
>んだから、
>それを排除すれば良いはずです。
それが、解らなかったのです・・・

ありがとうございました。

お礼日時:2005/08/13 11:00

こういう所で質問するのは構わないと思いますが、質問する前にググるなりなんなり自分で調査ってしてみましたか?


ぱっと見わかんないから丸投げ~ って感じを強く受けてしまいます。

で、質問の回答っていうかアドバイスですが、SQLを組む時はいきなり全部を作ろうとしないで最小の単位のものから一つ一つ作っていくとわかりやすいですよ。

最後にJOINが多くて面倒なら(+)を使ってみたらどうでしょうか?
いくらかでも見易くなると思いますが。

この回答への補足

すみまんせん。[ROW_NUMBER]を使用する事は
解ったのですが、どこに入れれば良いのかが
解りませんでした。反省しております。

補足日時:2005/08/13 11:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!