プロが教える店舗&オフィスのセキュリティ対策術

SQL初心者です。

ORACLEで、SELECT句に副問い合わせを付けたところ、ORA-00913:値の個数が多すぎますとエラーになってしまいます。
解決法をご教授願います。

同一テーブルの同一項目を複数項目として取得したいのです。

SELECT
(SELECT
B.DDD
,B.EEE
FROM A_MST A
,B_MST B
WHERE A.AAA = B.BBB
AND A.BBB = CMST.CCC),
(SELECT
B.DDD
,B.EEE
FROM A_MST A
,B_MST B
WHERE A.AAA = B.BBB
AND A.BBB = CMST.FFF)
FROM C_MST CMST
WHERE
CMST.A_RYAKU = '123'

A 回答 (4件)

WITH AB AS (


SELECT B.DDD AS DDD
,B.EEE AS EEE
,A.BBB AS BBB
FROM A_MST A
,B_MST B
WHERE A.AAA = B.BBB
)
SELECT (SELECT A.DDD FROM AB A WHERE A.BBB = CMST.CCC) AS DDD_CCC
,(SELECT A.EEE FROM AB A WHERE A.BBB = CMST.CCC) AS EEE_CCC
,(SELECT A.DDD FROM AB A WHERE A.BBB = CMST.FFF) AS DDD_FFF
,(SELECT A.EEE FROM AB A WHERE A.BBB = CMST.FFF) AS EEE_FFF
FROM C_MST CMST
WHERE CMST.A_RYAKU = '123'
    • good
    • 0
この回答へのお礼

WITHを使わせてもらうことにしました。
ありがとうございます。

お礼日時:2010/02/09 08:13

テストしとらんけどクロス結合じゃダメなんかな?


イメージ的にはこんな感じ
WITH AB AS(SELECT A.AAA, A.BBB, B.BBB as BBB2, B.DDD, B.EEE FROM A_MST A, B_MST B),
SELECT DISTINCT A.DDD, A.EEE, B.DDD, B.EEE
FROM AB A CROSS JOIN AB B
WHERE A.AAA = B.BBB2
AND EXISTS( SELECT 1 FROM C_MST CMST
WHERE CMST.A_RYAKU = '123'
AND ( (CMST.CCC = A.BBB OR CMST.FFF = A.BBB)
OR (CMST.CCC = B.BBB OR CMST.FFF = B.BBB) )
)
.

まぁ、どう転んでも効率悪いからテーブルそのものの
正規化することをおすすめします。
親子関係があるのならせめて CONNECT BY使えるようにするとか。。。
    • good
    • 0
この回答へのお礼

WITHを使うことにしました。
ありがとうございました。

お礼日時:2010/02/09 08:15

エラーの原因は「スカラー副問合せ式」が複数行を返せないからです。


>スカラー副問合せ式は、1つの行から1つの列値のみを戻す副問合せです。
http://otndnld.oracle.co.jp/document/products/or …

「1列だけ返しなさい」と怒られて「ORA-00913:値の個数が多すぎます」が発生するわけです。

まあ、素直に書くと結合で書きます。
「A_MAST」と「B_MAST」を二回読むので効率はよろしくなさそうですが、工夫してみてください。

select
b.ddd as col1,
b.eee as col2,
y.ddd as col3,
y.eee as col4
from c_mast as CMST
left outer join A_MAST AS a ON a.bbb = cmst.ccc
left outer join B_MAST AS b ON b.aaa = a.bbb
left outer join A_MAST AS x ON x.bbb = cmst.fff
left outer join B_MAST AS y ON y.aaa = x.bbb
WHERE CMST.A_RYAKU = '123'
;
    • good
    • 0
この回答へのお礼

スカラー副問い合わせというのですね。
ありがとうございました。

お礼日時:2010/02/09 08:14

質問に書かれているSQLは、構文が正しくないので、エラーになっていると思いますよ。



多分、こんな感じで良いんじゃないかと。
SELECT
CASE WHEN A.BBB=CMST.CCC THEN B.DDD END,
CASE WHEN A.BBB=CMST.CCC THEN B.EEE END,
CASE WHEN A.BBB=CMST.FFF THEN B.DDD END,
CASE WHEN A.BBB=CMST.FFF THEN B.EEE END
FROM A_MST A,B_MST B
WHERE A.AAA=B.BBB AND (A.BBB=CMST.CCC OR A.BBB=CMST.FFF) AND CMST.A_RYAKU = '123;
    • good
    • 1
この回答へのお礼

こんなやり方もあるのですね。
ありがとうございます。

お礼日時:2010/02/09 08:11

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

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A