• ベストアンサー

Oracl[10g]の SQL文について(No.8)

jchの回答

  • ベストアンサー
  • jch
  • ベストアンサー率38% (7/18)
回答No.1

SELECT K.NO,K.N1,K.N2,K.N3 FROM (SELECT B.NO NO,B.CODE_1,A1.NAME N1,B.CODE_2,A2.NAME N2,B.CODE_3,A3.NAME N3 FROM B,(select code, DECODE(CODE,NULL,NULL,NAME) NAME from A) A1, (select code, DECODE(CODE,NULL,NULL,NAME) NAME from A) A2, (select code, DECODE(CODE,NULL,NULL,NAME) NAME from A) A3 WHERE A1.CODE(+) = B.CODE_1 AND A2.CODE(+) = B.CODE_2 AND A3.CODE(+) = B.CODE_3) K WHERE K.NO='1' GROUP BY K.NO, K.N1, K.N2, K.N3 ORDER BY K.NO 結果 1 NAME-1 NAME-2 NULL

m-toshi
質問者

お礼

落ち着いて、BをA2に置き換えるとできました。 すみません。 つまり、 SELECT K.NO,K.N1,K.N2,K.N3 FROM (SELECT a2.NO NO,a2.CODE1,A1.NAME N1,a2.CODE2,A2.NAME N2,a2.CODE3,A3.NAME N3 FROM a2, (select code, DECODE(CODE,NULL,NULL,NAME) NAME from A) A1, (select code, DECODE(CODE,NULL,NULL,NAME) NAME from A) A2, (select code, DECODE(CODE,NULL,NULL,NAME) NAME from A) A3 WHERE A1.CODE(+) = a2.CODE1 AND A2.CODE(+) = a2.CODE2 AND A3.CODE(+) = a2.CODE3) K WHERE K.NO='1' GROUP BY K.NO, K.N1, K.N2, K.N3 ORDER BY K.NO と、なりました。1つ質問なのですが、 >DECODE(CODE,NULL,NULL,NAME) この部分は、A2テーブルにCODE1-3と、3つある為で例えば5つならば、 [DECODE(CODE,NULL,NULL,NULL,NULL,NAME)] と、なるのでしょうか ? 宜しくお願い致します。

m-toshi
質問者

補足

せっかく、ご回答を頂いたのですが、動きません。 「"B"."CODE_3":無効な識別子です」とエラーに なります。今回、Bテーブルは無いのでA2テーブルに 置き換えて見ましたが出来ません。 続けてのご指導をお願い致します。

関連するQ&A

  • Oracl[10g]の SQL文について(No.7)

    何度も恐縮です。また、違った事が出てきました。(^^; 皆様にとっては、似たような事ばかりかと思いますが・・・ Oracl[10g]の SQL文について、教えて下さい。 [A]テーブルに [CODE](key) と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [A2]テーブルに[NO](key) [CODE1] と [CODE2] と [CODE3]フィールドがあるとします。 内容は、 1 A-1 A-2 (null) 2 A-2 A-1 A-3 3 (null)A-3 A-2 と、します。 結果が、 1 A-1 NAME-1 A-2 NAME-2 (null) (null) 2 A-2 NAME-2 A-1 NAME-1 A-3 NAME-3 3 (null/null)A-3 NAME-3 A-2 NAME-2 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A1x.CODE1,A.NAME,A2x.CODE2, A.NAME,A3x.CODE3, A.NAME FROM A, (SELECT A.CODE, A.NAME, A2.CODE1 FROM A,A2 WHERE A.CODE=A2.CODE1 GROUP BY A.CODE,A.NAME,A2.CODE1) A1x, (SELECT A.CODE, A.NAME, A2.CODE2 FROM A,A2 WHERE A.CODE=A2.CODE2 GROUP BY A.CODE,A.NAME,A2.CODE2) A2x, (SELECT A.CODE, A.NAME, A2.CODE3 FROM A,A2 WHERE A.CODE=A2.CODE3 GROUP BY A.CODE,A.NAME,A2.CODE3) A3x WHERE A.CODE=A1x.CODE1 AND A.CODE=A2x.CODE2 AND A.CODE=A3x.CODE3 と、自分でチャレンジしたのですが、何も出てきません。 よろしくお願い致します。

  • Oracl[10g]の SQL文について(No.7)

    何度も本当に恐縮です。自力で頑張ろうと思いましたが無理でした。(;_;) Oracl[10g]の SQL文について、教えて下さい。 [A]テーブルに [CODE](key) と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [A2]テーブルに [NO](key) と [CODE1] と [KIN1] と [CODE2] と [KIN2] フィールドがあるとします。内容は、 1 A-1 100 (null null) 2 A-1 10 A-3 300 3 A-2 20 A-1 10 4 A-3 5000 A-1 20 と、します。 5 A-3 500 結果が、 A-1 NAME-1 110[A2]テーブル[KIN1]の合計 30[A2]テーブル[KIN2]の合計 A-2 NAME-2 20[A2]テーブル[KIN1]の合計 0(null) A-3 NAME-3 5500[A2]テーブル[KIN1]の合計 300 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A.CODE, A.NAME, SUM(A2.KIN1) AS KIN1, SUM(A2.KIN2) AS KIN2 FROM A,A2 WHERE A2.CODE1=A.CODE OR A2.CODE2=A.CODE GROUP BY A.CODE, A.NAME と、すると何故か A-1 NAME-1 5130 330 A-2 NAME-2 20 10 A-3 NAME-3 5510 320 と、言う結果になってしまいます。 よろしくお願い致します。

  • Oracle[10g]のSQL文について(改めて)

    すみません。[B]テーブルの作成がおかしい様でしたので、 改めて質問させて下さい。 Oracle[10g]のSQL文についての質問です。(No.???) [A]テーブルに [CODE](KEY) [CODE2] [NAME] のフィールドがあります。 A-1 B-1 NAME-1 A-2 B-2 NAME-2 A-3 B-3 NAME-3 [B]テーブルに [CODE3](KEY) [NAMEB] のフィールドがあります。 B-1 NAME-B-1 B-2 NAME-B-2 [C1]テーブルに [NO](KEY) [LINE](KEY) [CODE] のフィールドがあります。 X 1 A-1 X 2 A-3 Y 1 A-2 結果が [NO/LINE/CODE/NAMEB] X 1 A-1 NAME-B-1 X 2 A-3 (NULL) と、なる様にしたいのです。 SELECT C1.NO, C1.LINE,C1.CODE, Tx.NAMEB FROM C1 , ( SELECT C1.CODE, TNMx1.NAMEB FROM C1, ( SELECT CODE, CODE2, CODE3, NAMEB FROM A, B WHERE A.CODE2 = B.CODE3 ) TNMx1 WHERE C1.NO = 'X' AND C1.CODE = TNMx1.CODE(+) ) Tx WHERE C1.NO = 'X' GROUP BY C1.NO, C1.LINE,C1.CODE, Tx.NAMEB と、考えたのですが、何故か結果が X 1 A-1 (NULL) X 1 A-1 NAME-B-1 X 2 A-3 (NULL) X 2 A-3 NAME-B-1 4行もでてしまいます。 問題は、[B]テーブルです。 宜しくお願い致します。

  • Oracl[10g] の SQL文について(No.4)

    何度も恐縮です。また、違った事が出てきました。(^^; Oracl[10g] の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 B-1 NAME-3 と、します。 条件は、[CODE]の左1文字が’A’の物のみを取り出したいのです。 要するに、結果が、 A-1 NAME-1 A-2 NAME-2 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A.CODE,A.NAME, WHERE LEFT(A.CODE,1)='A' GROUP BY A.CODE,A.NAME ORDER BY A.CODE と、すればエラーになってしまいます。 よろしくお願い致します。

  • Oracl[10g]の SQL文について(No5)

    何度も恐縮です。また、違った事が出てきました。(^^; Oracl[10g]の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [NOUKI] と [KIN] と [CODE2] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 AAA A-1 2005/01/02 200 AAA A-2 2005/01/01 300 AAA A-2 2005/01/10 400 DDD A-2 2005/12/10 500 EEE と、します。 [B2]テーブルに [CODE2] と [NO] と [KIN2] フィールドがあるとします。 内容は、 AAA 1 1000 AAA 2 2000 DDD 1 3000と、します。 結果が、 A-1 NAME-1 300[B]テーブルの合計 3000[B2]テーブルの合計 A-2 NAME-2 1200[B]テーブルの合計 3000[B2]テーブルの合計 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? つまり、[CODE2]のフィールドを[B2]テーブルに反映させたいのです。 SELECT A.CODE,A.NAME,SUM(B.KIN),SUM(B2.KIN2) FROM A, B, B2 WHERE A.CODE=B.CODE AND B.CODE2=B2.CODE2 GROUP BY A.CODE,A.NAME ORDER BY A.CODE と、すれば、何故か A-1 NAME-1 600 6000 A-2 NAME-2 1000 6000 と、言う結果がでます。 これは、1つのSQL文では無理なのでしょうか ? よろしくお願い致します。

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

    なんども、恐縮です。 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) と、出てしまいます。 どうすれば良いのでしょうか ? 宜しくお願い致します。

  • OraclのSQL文について(No2)

    前回の質問の続きとなります。 Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [NOUKI] と [KIN] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 結果が、 A-1 NAME-1 300 A-2 NAME-2 1200 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A.CODE, A.NAME, B.KIN FROM A, B WHERE A.CODE = B.CODE ORDER BY A.CODE と、すると A-1 NAME-1 100 A-1 NAME-1 200 A-2 NAME-2 300 A-2 NAME-2 400 A-2 NAME-2 500 と、言う結果がでます。(当然ですが) しかし、 SELECT A.CODE, A.NAME, A2.KIN FROM A, A2 WHERE A.CODE = A2.CODE GROUP BY A.CODE,A.NAME ORDER BY A.CODE と、すると[GROUP BYの式ではありません]と、エラーになってしまいます。 (SUM文以前の問題でした) よろしくお願い致します。

  • OraclのSQL文について(No3)

    何度も恐縮です。また、違った事が出てきました。(^^; Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [NOUKI] と [KIN] と [CODE2] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 AAA A-1 2005/01/02 200 BBB A-2 2005/01/01 300 CCC A-2 2005/01/10 400 DDD A-2 2005/12/10 500 EEE と、します。 結果が、 A-1 NAME-1 300 AAA A-2 NAME-2 1200 CCC と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? つまり、[CODE2]のフィードは一番最初を表示させたいのです。 SELECT A.CODE, A.NAME, B.CODE2, SUM(B.KIN) FROM A, B WHERE A.CODE = B.CODE GROUP BY A.CODE, A.NAME,B.CODE2 ORDER BY A.CODE と、すれば A-1 NAME-1 AAA 100 A-1 NAME-1 BBB 200 A-2 NAME-2 CCC 300 A-2 NAME-2 DDD 400 A-2 NAME-2 EEE 500 と、言う結果がでます。(当然ですが) これは、1つのSQL文では無理なのでしょうか ? よろしくお願い致します。

  • 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) と、出てしまいます。 どうすれば良いのでしょうか ? 宜しくお願い致します。

  • SQL文で質問があります。

    商品マスタがあり、データは下記の感じで登録されています。  コード | 商品名  | 商品カナ | 分類コード ・・・ ---------------------------------------------------------  0001  | マウス  | マウス  | 01     ・・・  0002  | キーボード| キーボード| 01     ・・・  0003  | モニター | モニター | 01     ・・・          ・          ・          ・ SQL文で質問があります。 下記のSQLでは取得できるんですが・・・ SELECT * FROM M_SHOHIN WHERE code = ANY('{0001,0002,0003}'); 下記のSQLを実行したらエラーが出力されました。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT ARRAY_AGG(code) AS code FROM M_SHOHIN WHERE class_code = '01' ); ERROR: operator does not exist: character varying = character varying[] HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. なので下記のようにCASTをするようにして実行したらエラーは出力されなくなりましたがデータの取得ができませんでした。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT CAST(ARRAY_AGG(code) AS VARCHAR) AS code  FROM M_SHOHIN WHERE class_code = '01' ); どのようにすれば取得できますでしょうか。 説明が下手で申し訳ありませんがアドバイスいただけませんでしょうか。 データベースはPostgreSQL 8.4.9です。 宜しくお願いします。