- - PR -
条件を変えて複数のSQL文を一度に発行
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-10-19 12:02
個人的にはSQLを書くときは極力*を使わないほうが後でわかりやすいかと。
じゃんねっとさんもおっしゃってますが、UNION ALLでとると割と速い速度で 後が便利ですよ。 SELECT a.customerCode from (select customerCode from customer_MST UNION ALL select customerCode from test_MST UNION ALL select customerCode from set_MST) a where a.customerCode in ('123', '963', '741') とかどうでしょう? | ||||||||
|
投稿日時: 2005-10-19 13:36
みなさんご回答ありがとうございます。
まず、私の理解が薄い為に皆さんにご迷惑をお掛けしている事をお詫びいたします。 申し訳ございません。 さて、もうほとんど答えをいただいているような状況ですが、 SUICAさんからいただいた以下のSQL文でいけそうな気がしています。 >customer_MST.customerCode = test_MST.customerCode and >test_MST.customerCode = set_MST.customerCode and >customer_MST.customerCode in ('123', '963', '741') > >とかでは要件は満たせないでしょうか? これでやりたい事は完璧です。絶対ものにしなければ! っっっっっと思ったのですが、 set_MSTに指定のcustomerCodeを持つレコードが無い場合、 当然かもしれませんが、そのレコードを取得できません。 上記の例ですと'741'がset_MSTに存在しない場合 取得できるレコードは2件のみです。 customer_MSTとtest_MSTには必ず同じcustomerCodeがあるのですが、 set_MSTだけはcustomerCodeが無い場合があります。 このような場合でも 上記の例で3件のレコードを取得する方法はあるでしょうか? (もちろん3つのテーブルを結合して取得するレコードの set_MSTの分のフィールドの値が空でも) 情報が小出しになっていますし、更に低級な発言です。 本当にみなさん申し訳ございません。 何卒よろしくお願いいたします。 | ||||||||
|
投稿日時: 2005-10-19 13:58
やりたいことはこういうことなのかな?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22223&forum=26 | ||||||||
|
投稿日時: 2005-10-19 14:16
これで取れると思いますが
select b.* from customer_MST a left join customer_MST b on a.customerCode = b.customerCode where a.customerCode in ('123', '963', '741') UNION ALL select b.* from customer_MST a left join test_MST b on a.customerCode = b.customerCode where a.customerCode in ('123', '963', '741') UNION ALL select b.* from customer_MST a left join set_MST b on a.customerCode = b.customerCode where a.customerCode in ('123', '963', '741') | ||||||||
|
投稿日時: 2005-10-19 14:30
ご回答にとても感謝しております。
さて、ご提示いただいた、背古井さんのSQL文で試したところ、 サーバー : メッセージ 205、レベル 16、状態 1、行 1 UNION 演算子を含む SQL ステートメント内のすべてのクエリは、ターゲット リスト内に同じ数の式を持たなくてはなりません。 上記のエラーが発生しました。 と、ここでミソジマエさんからご提示のあったスレッドを拝見したところ、 これは、しっかりと外部結合というものを理解しなければならないと痛感しました。 背古井さん、せっかくこんなにも親身になっていただいたのに、 ご期待にこたえる事ができず、反省しております。 ちょっとこれからなるべく短時間で理解してまいりますので、 また書き込ませてください。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2005-10-19 14:33
(1)customer_MSTとtest_MSTをcustomerCodeで結合する。 (2) (1)で結合したものとset_MSTを外部結合する。 って感じでよろしいでしょうか?
(*)customer_Codeの"_"をはずしちゃってるんで、 テストする際は環境に合わせてくださいね。 ミソジマエさんかリンク張ってくださった先に 勉強する上で有益と思われる情報が書かれています。 よろしかったら勉強してみてくださいね。 #以下追記 SQL Server2000でテストしました。 多分Oracleでもいける・・・はず。 [ メッセージ編集済み 編集者: 夏椰【SUICA】 編集日時 2005-10-19 14:34 ] | ||||||||
|
投稿日時: 2005-10-19 16:36
ああ、すいませんちょっと不親切でしたね。
select b.結果としてとりたいカラム名 as GETNAME from customer_MST a left join customer_MST b on a.customerCode = b.customerCode where a.customerCode in ('123', '963', '741') UNION ALL select b.結果としてとりたいカラム名 as GETNAME from customer_MST a left join test_MST b on a.customerCode = b.customerCode where a.customerCode in ('123', '963', '741') UNION ALL select b.結果としてとりたいカラム名 as GETNAME from customer_MST a left join set_MST b on a.customerCode = b.customerCode where a.customerCode in ('123', '963', '741') のように、UNIONを使用したSELECT文はつないだSELECT文として 同一の名前になるようにしてやる必要があります。取得したい 列名が複数ある場合も、列の数と、それぞれの列名を一致させてやらなければ いけません。 これでやってみてください。 | ||||||||
|
投稿日時: 2005-10-19 16:39
補足します
上であげました >b.結果としてとりたいカラム名 は3つのセレクト文のについて同じカラム名である必要はありません。 as以降の仮につける仮のカラム名(上ではGETNAMEGが同じであれば起動します。 | ||||||||
