何度も恐縮です。前回の質問の続きとなるかと思いますが・・・
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 a2.no, a2.code1,a_1.name, a2.code2,a_2.name, a2.code3,a_3.name
>from a2,
>(select code, name from a) a_1,
>(select code, name from a) a_2,
>(select code, name from a) a_3
>where
>a2.code1 = a_1.code(+) and
>a2.code2 = a_2.code(+) and
>a2.code3 = a_3.code(+)
と、教えて頂き、完成致しました。
これを、アレンジして、
SELECT A2.NO, A2x.N1, A2x.N2, A2x.N3
FROM A,A2 ,
(
select a2.no, a2.code1,a1x.name AS N1, a2.code2,a2x.name AS N2, a2.code3,a3x.name AS N3
from a2,
(select code, name from a) a1x,
(select code, name from a) a2x,
(select code, name from a) a3x
where
a2.code1 = a1x.code(+) and
a2.code2 = a2x.code(+) and
a2.code3 = a3x.code(+)
) A2x
WHERE A2.NO='1'
GROUP BY A2.NO, A2x.N1, A2x.N2, A2x.N3
ORDER BY A2.NO
と、作りました。つまり、
1 A-1 NAME-1 A-2 NAME-2 (null) (null)
と、言う結果が欲しいのです。
ところが、
1 (null) NAME-3 NAME-2
1 NAME-1 NAME-2 (null)
1 NAME-2 NAME-2 NAME-3
と、3行も出てしまいます。
よろしくお願い致します。
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
この回答への補足
せっかく、ご回答を頂いたのですが、動きません。
「"B"."CODE_3":無効な識別子です」とエラーに
なります。今回、Bテーブルは無いのでA2テーブルに
置き換えて見ましたが出来ません。
続けてのご指導をお願い致します。
落ち着いて、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)]
と、なるのでしょうか ? 宜しくお願い致します。
No.4
- 回答日時:
どう書いて良いか難しいのですが・・
最初の投稿にあった”教えて頂いた”SQLを基にして
書きましたが、このSQLは、項目名に対し別名を付けて
いないが為、サブクエリ化すると、別名エラーが出るようです。
SELECT * FROM (
select b.no, b.code1,a_1.name NAME1, b.code2,a_2.name NAME2, b.code3,a_3.name NAME3
from tbl_b b,
(select code,name from tbl_a) a_1,
(select code,name from tbl_a) a_2,
(select code,name from tbl_a) a_3
where
b.code1 = a_1.code(+) and
b.code2 = a_2.code(+) and
b.code3 = a_3.code(+)
)
WHERE NO=1
;
のように、列名が同じにならないように、別名を付けて
サブクエリ化すれば、「列の定義が未確定です」とは
なりません。
No.3
- 回答日時:
#2ですが、補足へのレスです。
>教えていただいたSQL文ですが、「列の定義が未確定です」と、
これは、あなたの投稿した最初のSQLが、元々「列の定義が未確定です」といわれる
間違ったSQLなのか、検証するための転記で、記述ミスしているのかいずれかです。
select *
from
(
投稿SQL
)
where 投稿SQLの結果の第1フィールド = '1'
としているので、改造部分でのエラーはありえません。
>この方が、実行も早いと考えて良いのでしょうか ?
無駄な結合をして速くなることなどありえない。
この回答への補足
なんどもすみません。ありがとうございます。
>select *
>from
>(
>投稿SQL
>)
>where 投稿SQLの結果の第1フィールド = '1'
投稿SQLをそのままコピーして実行しました。エラーは出ませんが
結果は、やはり3行になってしまいました。
出来れば、続けてのご指導を頂ければ幸いです。
No.2
- 回答日時:
SELECT A2.NO, A2x.N1, A2x.N2, A2x.N3
FROM A,A2 ,
(
:
) A2x
WHERE A2.NO='1' <== ココ注目!
GROUP BY A2.NO, A2x.N1, A2x.N2, A2x.N3
ORDER BY A2.NO
FROMに、サブクエリと実表の複数を書いているのに、
その結合条件を、何故書かないのですか?
適切な結合条件を書くことで、望む結果は得られると思います。
もっとも、どなたかに、教わったSQLを抽出したいだけとも解釈できるので...
SELECT * FROM (
select a2.no, a2.code1,a_1.name, a2.code2,a_2.name, a2.code3,a_3.name
from a2,
(select code, name from a) a_1,
(select code, name from a) a_2,
(select code, name from a) a_3
where
a2.code1 = a_1.code(+) and
a2.code2 = a_2.code(+) and
a2.code3 = a_3.code(+)
)
WHERE NO=1
と書く方が、無駄な結合を増やさなくて済みます。
この回答への補足
ご回答をありがとうございます。
>もっとも、どなたかに、教わったSQLを
>抽出したいだけとも解釈できるので...
その通りです。(^^;
教えていただいたSQL文ですが、「列の定義が未確定です」と、エラーになってしまいます。自分で考えたのですが、わかりません。すみません。
それと、
>と書く方が、無駄な結合を増やさなくて済みます。
この方が、実行も早いと考えて良いのでしょうか ?
続けての、ご指導をお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- MySQL mysqlの結合について教えてください 1 2022/05/19 15:13
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Visual Basic(VBA) ローマ字、ハイフン付きの並び替え ローマ字抽出方法 Excelマクロ 4 2022/04/01 14:10
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- JavaScript JavascriptからSQLへ繋ぎ方が分からない 3 2022/07/07 00:27
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
ちょっと先の未来クイズ第6問
2025年1月2日と1月3日に行われる、第101回箱根駅伝(東京箱根間往復大学駅伝競走)で、上位3位に入賞するチームはどこでしょう?
-
【お題】逆襲の桃太郎
【大喜利】桃太郎が1回鬼退治に失敗したところから始まる新作昔話「リベンジオブ桃太郎」にはこんなシーンがある
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
今から楽しみな予定はありますか?
いよいよ2025年が始まりました。皆さんには、今から楽しみにしている予定はありますか?
-
unionでマージした副問合せを結合
Oracle
-
単一グループのグループ関数ではありません。
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CPRM decrypterのエラーコード...
-
テーブル名が可変の動的SQLをフ...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
CSVファイルを読み込んでテーブ...
-
sqlに記述できない文字
-
SQLで、Join句で結合したテ...
-
配列データに対する、要素の追...
-
UPDATEで既存のレコードに文字...
-
エラーを起こす方法
-
PostgreSQLのtimestamp型で時間...
-
既にテーブルが存在する場合の...
-
truncate tableを使って複数の...
-
1つのSQLで2段階の抽出を行い...
-
既存データをINSERT文にして出...
-
SQLのテーブルにないデータの出力
-
UPDATEの更新前の値を取得したい
-
2つのテーブルをLIKE演算子のよ...
-
ACCESSのVBAにてExcelに行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPRM decrypterのエラーコード...
-
実行時エラー:2517 プロシージ...
-
テーブル名が可変の動的SQLをフ...
-
Activation codeとは
-
Oracl[10g]の SQL文について(No.8)
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
-
PostgreSQLのtimestamp型で時間...
-
UPDATEで既存のレコードに文字...
-
既存データをINSERT文にして出...
-
truncate tableを使って複数の...
-
エラーを起こす方法
-
SQLで、Join句で結合したテ...
-
timestampのデータはどのように...
-
オラクルのUPDATEで複数テーブル
-
2つのテーブルをLIKE演算子のよ...
-
テーブル名が可変の場合のクエ...
-
データ削除とSQL*Loaderでのイ...
おすすめ情報