- ベストアンサー
Oracle[10g]のSQL文について
- Oracle[10g]のSQL文についての質問です。結果が[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)と、出てしまいます。
- どうすれば良いのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#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
その他の回答 (3)
- MZ-80B
- ベストアンサー率56% (46/81)
ROW_NUMBER で過去ログを検索してください。 参考になるものが多数でてくると思います。 ピタリ正解ではないですが、あとはご自分で解決できると思います。 参考URLは一例
補足
ご回答をありがとうございます。 早速、調べて、 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 と、作成したのですが、結果は同じなのです。(;_;) 何故でしょう? (自分で解決できない事がなさけないです)
- raphel_7
- ベストアンサー率34% (86/252)
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 を使用したいのです。 宜しくお願い致します。
- fu_u_ka_i
- ベストアンサー率51% (15/29)
>要するに、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]がほしいのです。 宜しくお願い致します。
お礼
ありがとうございます。ようやく動きました。 が、実際は、もっと複雑なので、どこに[ROW_NUMBER]を いれて良いのかが解りません。情けない限りです。 改めて、質問をさせてください。 宜しくお願い致します。