- PR -

条件を変えて複数のSQL文を一度に発行

投稿者投稿内容
背古井
常連さん
会議室デビュー日: 2004/04/02
投稿数: 39
投稿日時: 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/04/27
投稿数: 43
投稿日時: 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/09/25
投稿数: 43
投稿日時: 2005-10-19 13:58
やりたいことはこういうことなのかな?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22223&forum=26
背古井
常連さん
会議室デビュー日: 2004/04/02
投稿数: 39
投稿日時: 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/04/27
投稿数: 43
投稿日時: 2005-10-19 14:30
ご回答にとても感謝しております。

さて、ご提示いただいた、背古井さんのSQL文で試したところ、

サーバー : メッセージ 205、レベル 16、状態 1、行 1
UNION 演算子を含む SQL ステートメント内のすべてのクエリは、ターゲット リスト内に同じ数の式を持たなくてはなりません。

上記のエラーが発生しました。

と、ここでミソジマエさんからご提示のあったスレッドを拝見したところ、
これは、しっかりと外部結合というものを理解しなければならないと痛感しました。


背古井さん、せっかくこんなにも親身になっていただいたのに、
ご期待にこたえる事ができず、反省しております。

ちょっとこれからなるべく短時間で理解してまいりますので、
また書き込ませてください。

よろしくお願いいたします。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-10-19 14:33
引用:

set_MSTに指定のcustomerCodeを持つレコードが無い場合、
当然かもしれませんが、そのレコードを取得できません。
上記の例ですと'741'がset_MSTに存在しない場合
取得できるレコードは2件のみです。

customer_MSTとtest_MSTには必ず同じcustomerCodeがあるのですが、
set_MSTだけはcustomerCodeが無い場合があります。
このような場合でも
上記の例で3件のレコードを取得する方法はあるでしょうか?
(もちろん3つのテーブルを結合して取得するレコードの
set_MSTの分のフィールドの値が空でも)



(1)customer_MSTとtest_MSTをcustomerCodeで結合する。
(2) (1)で結合したものとset_MSTを外部結合する。

って感じでよろしいでしょうか?

コード:

select * from
customer_MST join test_MST
on customer_MST.customerCode = test_MST.customerCode and
customer_MST.customerCode in ('123', '963', '741')
left outer join set_MST on test_MST.customerCode = set_MST.customerCode



(*)customer_Codeの"_"をはずしちゃってるんで、
テストする際は環境に合わせてくださいね。


ミソジマエさんかリンク張ってくださった先に
勉強する上で有益と思われる情報が書かれています。
よろしかったら勉強してみてくださいね。

#以下追記

SQL Server2000でテストしました。
多分Oracleでもいける・・・はず。


[ メッセージ編集済み 編集者: 夏椰【SUICA】 編集日時 2005-10-19 14:34 ]
背古井
常連さん
会議室デビュー日: 2004/04/02
投稿数: 39
投稿日時: 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文として
同一の名前になるようにしてやる必要があります。取得したい
列名が複数ある場合も、列の数と、それぞれの列名を一致させてやらなければ
いけません。
これでやってみてください。
背古井
常連さん
会議室デビュー日: 2004/04/02
投稿数: 39
投稿日時: 2005-10-19 16:39
補足します
上であげました

>b.結果としてとりたいカラム名

は3つのセレクト文のについて同じカラム名である必要はありません。

as以降の仮につける仮のカラム名(上ではGETNAMEGが同じであれば起動します。

スキルアップ/キャリアアップ(JOB@IT)