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

解決済みの質問

select句副問い合わせ 値の個数が多すぎます

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'

投稿日時 - 2010-02-08 09:40:34

QNo.5658535

すぐに回答ほしいです

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

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'

投稿日時 - 2010-02-08 12:52:42

お礼

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

投稿日時 - 2010-02-09 08:13:13

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

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

回答(4)

ANo.4

テストしとらんけどクロス結合じゃダメなんかな?
イメージ的にはこんな感じ
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使えるようにするとか。。。

投稿日時 - 2010-02-09 00:19:11

お礼

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

投稿日時 - 2010-02-09 08:15:45

ANo.3

エラーの原因は「スカラー副問合せ式」が複数行を返せないからです。
>スカラー副問合せ式は、1つの行から1つの列値のみを戻す副問合せです。
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19201-02/expressions.html#4573

「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'
;

投稿日時 - 2010-02-08 12:56:39

お礼

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

投稿日時 - 2010-02-09 08:14:23

質問に書かれている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;

投稿日時 - 2010-02-08 12:43:00

お礼

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

投稿日時 - 2010-02-09 08:11:55

あなたにオススメの質問