- PR -

テーブルの結合方法2

投稿者投稿内容
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-03-27 16:03
お世話になります。

現在、SQLサーバー2000(SP4)でストアドプロシージャを作成しています。
下記のようにテーブルAとテーブルBからJOINしたデータを下記抽出結果のような形で取得したいと考えています。

テーブルA
コード1|コード2|コード3|・・・・コード9
----------------------------------------------
100   |200   |300   |・・・・900

テーブルB
コード|テキスト
----------------
100  |あああ
200  |いいい
300  |ううう
・・・・・・・・
900  |けけけ

抽出結果
コード1|テキスト1|コード2|テキスト2|・・コード9|テキスト9
--------------------------------------------------------------------
100   |ああああ |200   |いいい  |・・900   |けけけ

この場合、
SELECT コード1,T1.テキスト,コード2,T2.テキスト,・・・,コード9,T9.テキスト
FROM テーブルA
INNER JOIN テーブルB T1 ON (テーブルA.コード1=T1.コード)
INNER JOIN テーブルB T2 ON (テーブルA.コード1=T2.コード)
・・・・・
INNER JOIN テーブルB T9 ON (テーブルA.コード1=T9.コード)
のようなSELECT文になると思います。

このように同じテーブルをJOINする項目の数だけつなぐのはSELECT文が非常に長くなってしまいます。でも私は他に効率よくSELECT文を書くことができません。
みなさんは何か良いSELECT文の書き方が思いついたりしないでしょうか?
もし良いアドバイスがあればよろしくお願いします。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-03-27 18:29
ともこさん、こんにちは。

これで良いと思います。INNER JOINで大丈夫かな?という気はしますが。
正規化するのが一番ですが、そういうわけにもいかないのですよね?
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-03-27 18:34
よっしーさん、お世話になります。

INNER JOINよりOUTER JOINの方が良いですよね、じゃないとレコードが表示されないケースもあるかもしれないんで。

ただJOINするテーブル数が数個なら良いのですが、20、30と増えるとすごいことになりそうで^^;
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2008-03-27 19:59
名称だけであれば、SELECT句でスカラー値サブクエリを使うと
テーブルBの別名が必要ないので多少すっきりするかもしれません。

SELECT
コード1,
(SELECT TOP 1 テーブルB.テキスト FROM テーブルB WHERE テーブルB.コード テーブルA.コード1) AS テキスト1 ,
コード2,
(SELECT TOP 1 テーブルB.テキスト FROM テーブルB WHERE テーブルB.コード テーブルA.コード2) AS テキスト2 ,


・,
コード9,
(SELECT TOP 1 テーブルB.テキスト FROM テーブルB WHERE テーブルB.コード テーブルA.コード9) AS テキスト3 ,
FROM テーブルA


後はあらかじめ名称取得用のユーザー定義関数を用意するかですね。
一時ユーザー定義関数さえサポートしてくれたら…



[ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2008-03-27 20:05 ]
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2008-03-27 20:28
ストアドプロシージャを作成しているんですよね?
つまり、T-SQLでプログラムを書いているわけですよね?

であれば、無理にJoinせずとも、T-SQLのロジックでどうにかするほうがよかったりしないでしょうか。
テーブルAからSELECTする前に、テーブルBの中身をキャッシュしとくとか。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-03-28 00:27
引用:
ハニワ祭りさんの書き込み (2008-03-27 19:59) より:
コード1,
(SELECT TOP 1 テーブルB.テキスト FROM テーブルB WHERE テーブルB.コード テーブルA.コード1) AS テキスト1 ,


これも「ちらりとだけ」考えましたが、SQLをよく知らない人には多用してほしくないので書きませんでした。

引用:
名称だけであれば


「名称だけ」ならまだ良いのですが、複数項目が必要でも使われそうで。。
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-03-28 10:49
ハニワ祭りさん、カーニーさん、よっしーさん、ありがとうございます。

>ハニワ祭りさんより-------
>名称だけであれば、SELECT句でスカラー値サブクエリを使うと
>テーブルBの別名が必要ないので多少すっきりするかもしれません。
>-------------------------
このテクニックは知っていたのですが、これもこれで抽出項目の数だけSELECTが行われるので処理速度が遅くなりそうな気がしてました。
ユーザー定義関数にするとその分だけは処理速度が速くなるのでしょうか?
時間があれば試してみます、ありがとうございます!

>カーニーさんより---------
>テーブルAからSELECTする前に、テーブルBの中身をキャッシュしとくとか。
>-------------------------
これってどういう意味なのでしょうか?ちょっと興味があるのでもう少し教えていただけないでしょうか?


よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-03-28 11:12
引用:

ともこさんの書き込み (2008-03-28 10:49) より:
このテクニックは知っていたのですが、これもこれで抽出項目の数だけSELECTが行われるので処理速度が遅くなりそうな気がしてました。


「SQLをよく知らない人には」なんて書いてしまい、大変失礼しました。

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