- ベストアンサー
このSQL文の意味を教えてください。
SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
= は内部結合の符号、*= あるいは =* は外部結合の符号です。 Aのテーブルにあるレコードをすべて返します。 テーブルAにidがあり、そのidがBにないレコード状態にして、 SELECTリストにBのカラムも含めてSQLを流すと違いがわかると思います。 外部結合の書き方はこれだけではありませんが、 RDBMSにより使えるものが異なります。
その他の回答 (2)
- nda23
- ベストアンサー率54% (777/1415)
id が一意であれば、やはり意味がありません。 Aでid=1ならBでもid=1で、しかも一意なので1レコードしか該当 しません。それでいて、flagが1でもあり、0でもあると言うのは 絶対にあり得ない条件です。 もし、idが一意でない場合はflagが0と1の両方を持つという意味で 考えられる条件ではあります。しかし、そういう抽出条件ならば、 他に書きようがあり、この方法は少し違和感があります。 経験から見ると、SyBaseのエンジンはスマートなほうで、あまり 効率化を意識しなくても良いのですが、有名な○○○○では こういう書き方は速度の劣化を招きます。 SELECT A.* FROM (SELECT * FROM table WHERE flag=1) A, (SELECT id FROM table WHERE flag=0 GROUP BY id) B WHERE A.id=B.id このように条件を絞ったクエリ(レコード数が少ない)同士を結合 させる方が一般に高速です。
お礼
再度の回答ありがとうございます。 idは一意でないので、ありえる条件ということですね。 教えていただいたSQL文も参考になりました。 重ねて御礼申し上げます。
- nda23
- ベストアンサー率54% (777/1415)
SyBaseでしょうか? 結論から申しますと、意味の無い結合条件です。 「A.id *= B.id」とは「AにあればBに無くてもよい」と言う意味です。 A:Bが有:有、有:無なら対象、無:有は対象外ということです。 しかし、AとBは同じテーブルなので、有:無になることはありません。 意味があるのは「A.flag = 1」という条件だけです。 但し、同じテーブル同士を結合する例は結構でてきます。だから、 「同じテーブル同士を結合することは意味が無い」と決め付けない でください。ベテランと言われるSEの中にも同じテーブル同士を 結合させると言う発想ができない人がかなりいます。
お礼
回答ありがとうございます。 すみません、書き忘れました。SyBaseです。しかも、条件が抜けていました。もう1行 AND B.flag = 0 がありました。これがあれば意味のない結合条件ということではなくなりますか? 同じテーブル同士を結合している例を初めて見たのですが、結構あるものなのですね。マスターできるように頑張ります。
お礼
回答ありがとうございます。 外部結合の符号なのですね。調べても見つからなかったので助かりました。外部結合を調べると「JOIN」というのがあるのですが、何が違うのか分かりませんでした。RDBMSによって使い分けるのでしょうか?