- - PR -
テーブルの結合方法2
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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文の書き方が思いついたりしないでしょうか? もし良いアドバイスがあればよろしくお願いします。 | ||||||||
|
投稿日時: 2008-03-27 18:29
ともこさん、こんにちは。
これで良いと思います。INNER JOINで大丈夫かな?という気はしますが。 正規化するのが一番ですが、そういうわけにもいかないのですよね? | ||||||||
|
投稿日時: 2008-03-27 18:34
よっしーさん、お世話になります。
INNER JOINよりOUTER JOINの方が良いですよね、じゃないとレコードが表示されないケースもあるかもしれないんで。 ただJOINするテーブル数が数個なら良いのですが、20、30と増えるとすごいことになりそうで^^; | ||||||||
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2008-03-27 20:28
ストアドプロシージャを作成しているんですよね?
つまり、T-SQLでプログラムを書いているわけですよね? であれば、無理にJoinせずとも、T-SQLのロジックでどうにかするほうがよかったりしないでしょうか。 テーブルAからSELECTする前に、テーブルBの中身をキャッシュしとくとか。 | ||||||||
|
投稿日時: 2008-03-28 00:27
これも「ちらりとだけ」考えましたが、SQLをよく知らない人には多用してほしくないので書きませんでした。
「名称だけ」ならまだ良いのですが、複数項目が必要でも使われそうで。。 | ||||||||
|
投稿日時: 2008-03-28 10:49
ハニワ祭りさん、カーニーさん、よっしーさん、ありがとうございます。
>ハニワ祭りさんより------- >名称だけであれば、SELECT句でスカラー値サブクエリを使うと >テーブルBの別名が必要ないので多少すっきりするかもしれません。 >------------------------- このテクニックは知っていたのですが、これもこれで抽出項目の数だけSELECTが行われるので処理速度が遅くなりそうな気がしてました。 ユーザー定義関数にするとその分だけは処理速度が速くなるのでしょうか? 時間があれば試してみます、ありがとうございます! >カーニーさんより--------- >テーブルAからSELECTする前に、テーブルBの中身をキャッシュしとくとか。 >------------------------- これってどういう意味なのでしょうか?ちょっと興味があるのでもう少し教えていただけないでしょうか? | ||||||||
|
投稿日時: 2008-03-28 11:12
「SQLをよく知らない人には」なんて書いてしまい、大変失礼しました。 |