こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Oracle[10g]のSQL文について(新No.2)

なんども、恐縮です。
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)

と、出てしまいます。

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

投稿日時 - 2005-08-11 21:37:21

QNo.1574512

困ってます

質問者が選んだベストアンサー

#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

投稿日時 - 2005-08-12 15:33:17

お礼

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

投稿日時 - 2005-08-12 17:23:05

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

ROW_NUMBER で過去ログを検索してください。
参考になるものが多数でてくると思います。
ピタリ正解ではないですが、あとはご自分で解決できると思います。

参考URLは一例

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

投稿日時 - 2005-08-12 11:21:56

補足

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

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:28

ANo.2

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

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

投稿日時 - 2005-08-12 09:58:13

補足

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

投稿日時 - 2005-08-12 10:10:32

ANo.1

>要するに、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件なのか判りませんが・・)

投稿日時 - 2005-08-12 02:18:08

補足

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

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

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

投稿日時 - 2005-08-12 10:09:09

あなたにオススメの質問