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

なんども、恐縮です。
Oracle[10g]のSQL文についての質問です。(No.???)


[C1]テーブルに
[NO](KEY) [LINE](KEY) [CODE] のフィールドがあります。
X 1 A-1
X 2 A-3
Y 1 A-2

[C2]テーブルに
[NO](KEY) [LINE](KEY) [LINE2](KEY) [BIKO] のフィールドがあります。
X 1 1 A
X 1 2 B


結果が

[NO/LINE/CODE/BIKO]
X 1 A-1 A
X 2 A-3 (null)

と、なる様にしたいのです。
要するに、BIKOは、一番最初の物を取得したいのです。

SELECT C1.NO, C1.LINE, C2.BIKO
FROM C1
LEFT JOIN C2 ON (C1.NO = C2.NO) AND (C1.LINE = C2.LINE)
WHERE C1.NO='X'
ORDER BY C1.LINE

と、考えたのですが、結果が
X 1 A-1 A
X 1 A-1 B
X 2 (NULL)

と、出てしまいます。

どうすれば良いのでしょうか ?
宜しくお願い致します。

A 回答 (4件)

>要するに、BIKOは、一番最初の物を取得したいのです。


>
>SELECT C1.NO, C1.LINE, C2.BIKO
>FROM C1
>LEFT JOIN C2 ON (C1.NO = C2.NO) AND (C1.LINE = C2.LINE)
>WHERE C1.NO='X'
>ORDER BY C1.LINE
>
>と、考えたのですが、

あなたの考えたSQLで、”一番最初の”という条件は、どこに盛り込まれていますか?
(どのような基準で数えた最初の1件なのか判りませんが・・)

この回答への補足

説明不足で申し訳ございません。

[C2]テーブルに
[NO](KEY) [LINE](KEY) [LINE2](KEY) [BIKO] のフィールドがあります。
X 1 1 A
X 1 2 B

この[LINE]の最小値の[BIKO]がほしいのです。
宜しくお願い致します。

補足日時:2005/08/12 10:09
    • good
    • 0

SELECT C1.NO, C1.LINE, C2.BIKO


FROM C1,C2
WHERE C1.NO='X'
AND C1.NO = C2.NO(+)
AND C1.LINE = C2.LINE(+)
ORDER BY C1.LINE

でできるのでは?
環境がないので試していません

この回答への補足

ご回答をありがとうございます。
結果は、やはり3行でした。(;_;)
それと、他のテーブルとの絡みがありますので
JOIN を使用したいのです。
宜しくお願い致します。

補足日時:2005/08/12 10:10
    • good
    • 0

ROW_NUMBER で過去ログを検索してください。


参考になるものが多数でてくると思います。
ピタリ正解ではないですが、あとはご自分で解決できると思います。

参考URLは一例

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1274959

この回答への補足

ご回答をありがとうございます。
早速、調べて、

SELECT C1.NO, C1.LINE, C2.BIKO
FROM C1
LEFT JOIN C2 ON (C1.NO = C2.NO) AND (C1.LINE = C2.LINE),
(
SELECT C2.*,ROW_NUMBER() OVER(PARTITION
BY NO , LINE
ORDER BY NO,LINE,LINE2) R
FROM C2
) C1x
WHERE C1.NO='X' AND C1x.R=1
ORDER BY C1.LINE

と、作成したのですが、結果は同じなのです。(;_;)
何故でしょう? (自分で解決できない事がなさけないです)

補足日時:2005/08/12 14:29
    • good
    • 0

#3 です。


回答補足に骨組みを提示していただけたので、それを書き換えてみました。
コーディング慣れしている方だと、もう少しスマートなSQLがかけるかもしません。その辺はご容赦願います。

SELECT NO, LINE, CODE, BIKO
FROM (
SELECT C1.NO, C1.LINE, C1.CODE, C2.BIKO,
ROW_NUMBER() OVER( PARTITION BY C1.NO, C1.LINE ORDER BY C1.NO, C1.LINE, C2.LINE2) R_NUM
FROM C1
LEFT JOIN C2 ON (C1.NO = C2.NO) AND (C1.LINE = C2.LINE)
WHERE C1.NO='X'
)
WHERE R_NUM <= 1
ORDER BY NO, LINE
    • good
    • 0
この回答へのお礼

ありがとうございます。ようやく動きました。
が、実際は、もっと複雑なので、どこに[ROW_NUMBER]を
いれて良いのかが解りません。情けない限りです。
改めて、質問をさせてください。
宜しくお願い致します。

お礼日時:2005/08/12 17:23

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