- PR -

SQL文で制限条件をjoin句に記述

投稿者投稿内容
グレハン
常連さん
会議室デビュー日: 2006/02/23
投稿数: 25
投稿日時: 2007-09-04 10:48
DBはSQLSERVERです。

SQLを書く時に、外部結合するテーブルを制限する時は
1番:
コード:
SELECT A.ID,B.NAME
FROM A 
LEFT JOIN 
    (SELECT ID,NAME
     FROM B
     WHERE DELKBN = '0'
    ) B
  ON A.ID = B.ID


だと思っていたのですが、
2番:
コード:
SELECT A.ID,B.NAME
FROM A 
LEFT JOIN B
  ON A.ID = B.ID
 AND B.DELKBN = '0'


こう書くのが文法的には正しいのでしょうか?
今まで1番が正しい書き方だと思っていたので…

参考にした記事
http://support.microsoft.com/kb/176480/ja

詳しい方、よろしければご教授お願い致します。
tkrn
ベテラン
会議室デビュー日: 2005/10/25
投稿数: 61
投稿日時: 2007-09-04 11:01
参考にされた記事を見ますと、
コード:

SELECT A.ID,B.NAME
FROM A
LEFT JOIN
(SELECT ID,NAME
FROM B
WHERE DELKBN = '0'
) B
ON A.ID = B.ID


が正しいとか正しくないとかではなく、
コード:

SELECT A.ID,B.NAME
FROM A
LEFT JOIN B
ON A.ID = B.ID
WHERE B.DELKBN = '0'



コード:

SELECT A.ID,B.NAME
FROM A
LEFT JOIN B
ON A.ID = B.ID
AND B.DELKBN = '0'


は結果が違いますよ。
と言う内容じゃないでしょうか。

引用:

今まで1番が正しい書き方だと思っていたので…


どちらも有りだと思います。
場合によっては1番の書き方もしますし。
例えば、BのテーブルにDISTINCTや集計関数を噛ませたい場合等は1番の記述になりますよね。


[ メッセージ編集済み 編集者: tkrn 編集日時 2007-09-04 11:15 ]
グレハン
常連さん
会議室デビュー日: 2006/02/23
投稿数: 25
投稿日時: 2007-09-04 11:24
tkrn様 ご指摘ありがとうございます。
参考ページの説明はtkrn様がおっしゃったように
条件をつける時はこうしないと駄目ですよ!
ということですね。
ただ、私が気になったのがこのページの最後のSQL文の説明にある
>外部結合するテーブルを制限する正しい方法は、
>以下の例のように、FROM 句の ON の部分に
>外部結合するテーブルを制限する条件を置くことです。
の部分です。
情報処理技術系ではこの書き方はNGです!と記述したページがあるし
マイクロソフトはこれが正しい!と書いてあるので
どっちの書き方がいいのか判らなくなったのです。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2007-09-04 11:56
>情報処理技術系ではこの書き方はNGです!と記述したページがあるし
これはサイトの情報ですか?本の情報ですか?
詳細を知りたいと思います。

>外部結合するテーブルを制限する正しい方法は、
>以下の例のように、FROM 句の ON の部分に
>外部結合するテーブルを制限する条件を置くことです。
「外部」結合するにはONの部分に条件を置くこと以外ないと認識しています。
(oracleの(+)を除く)
tkrn
ベテラン
会議室デビュー日: 2005/10/25
投稿数: 61
投稿日時: 2007-09-04 12:05
引用:

>外部結合するテーブルを制限する正しい方法は、
>以下の例のように、FROM 句の ON の部分に
>外部結合するテーブルを制限する条件を置くことです。
の部分です。
情報処理技術系ではこの書き方はNGです!と記述したページがあるし
マイクロソフトはこれが正しい!と書いてあるので
どっちの書き方がいいのか判らなくなったのです。



これを3番として↓
コード:
 
SELECT A.ID,B.NAME
FROM A 
LEFT JOIN B
  ON A.ID = B.ID
WHERE B.DELKBN = '0'



この正しい方法の意味は、3番が結果として間違っているから
2番が正しいと言う意味じゃないでしょうか?

引用:

情報処理技術系ではこの書き方はNGです!



そうなんですか?
Web上で挙がっているなら、参考にそのURLを教えて欲しいです。

私が書くなら、この場合は確かに2番ですけど、1番がNGだと言うほどのものとも思いません。
グレハン
常連さん
会議室デビュー日: 2006/02/23
投稿数: 25
投稿日時: 2007-09-04 13:25
KOX様、tkrn様 ご返答ありがとうございます。

tkrn様の書込みより
引用:

この正しい方法の意味は、3番が結果として間違っているから
2番が正しいと言う意味じゃないでしょうか?


私の読解力が足りなかったみたいですね。
tkrn様の指摘されたような意味と理解することにします。

KOX様の書込みより
引用:

「外部」結合するにはONの部分に条件を置くこと以外ないと認識しています。
(oracleの(+)を除く)


私の勉強不足なのだと思いますが、私の記述した1番のSQLは
外部結合するテーブルを制限していることにはならないということでしょうか?

引用:

これはサイトの情報ですか?本の情報ですか?
詳細を知りたいと思います。


これは制限条件でググって見つけた別の掲示板なのですが、
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1010904660
ここのベストアンサーの方の回答にそのように記述されていたからです。
これが本当なのかわからなかったので、ここで皆さんにご質問させて頂いたのです。
tkrn
ベテラン
会議室デビュー日: 2005/10/25
投稿数: 61
投稿日時: 2007-09-04 14:45
ANSI標準は詳しくないのでググってみましたが、考え過ぎじゃないでしょうか?

確かにONに結合条件を書きましょう的な事は書かれていますが、それに伴う制限条件は書くなとはどこにも書いてないように思えます。
実際ACCESSでもSQLServerでもOracleでも2番の様な書き方はできますし。

DELKBN=0は制限条件の様に捉えられていますが、解釈によっては結合条件であるようにも取れなくはないでしょうか。
#「IDが一致し、かつBテーブルのDELKBNが0のものを外部結合する」という結合条件
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2007-09-04 14:56
引用:

グレハンさんの書き込み (2007-09-04 13:25) より:
KOX様の書込みより
引用:

「外部」結合するにはONの部分に条件を置くこと以外ないと認識しています。
(oracleの(+)を除く)


私の勉強不足なのだと思いますが、私の記述した1番のSQLは
外部結合するテーブルを制限していることにはならないということでしょうか?


失礼しました。私の読解力不足です。無視してください。

で本題をしっかり読み直して検証中・・・
tkrnさんがおっしゃっているように、特に問題ないと思いますよ。
役に立ってなくて申し訳ないです。

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