dポイントプレゼントキャンペーン実施中!

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つ並べている意味がよく分かりません。

よろしくお願いします。

A 回答 (3件)

= は内部結合の符号、*= あるいは =* は外部結合の符号です。


Aのテーブルにあるレコードをすべて返します。

テーブルAにidがあり、そのidがBにないレコード状態にして、
SELECTリストにBのカラムも含めてSQLを流すと違いがわかると思います。

外部結合の書き方はこれだけではありませんが、
RDBMSにより使えるものが異なります。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
外部結合の符号なのですね。調べても見つからなかったので助かりました。外部結合を調べると「JOIN」というのがあるのですが、何が違うのか分かりませんでした。RDBMSによって使い分けるのでしょうか?

お礼日時:2009/06/29 18:46

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
このように条件を絞ったクエリ(レコード数が少ない)同士を結合
させる方が一般に高速です。
    • good
    • 0
この回答へのお礼

再度の回答ありがとうございます。
idは一意でないので、ありえる条件ということですね。
教えていただいたSQL文も参考になりました。
重ねて御礼申し上げます。

お礼日時:2009/06/30 15:38

SyBaseでしょうか?


結論から申しますと、意味の無い結合条件です。
「A.id *= B.id」とは「AにあればBに無くてもよい」と言う意味です。
A:Bが有:有、有:無なら対象、無:有は対象外ということです。
しかし、AとBは同じテーブルなので、有:無になることはありません。
意味があるのは「A.flag = 1」という条件だけです。

但し、同じテーブル同士を結合する例は結構でてきます。だから、
「同じテーブル同士を結合することは意味が無い」と決め付けない
でください。ベテランと言われるSEの中にも同じテーブル同士を
結合させると言う発想ができない人がかなりいます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
すみません、書き忘れました。SyBaseです。しかも、条件が抜けていました。もう1行
AND B.flag = 0
がありました。これがあれば意味のない結合条件ということではなくなりますか?

同じテーブル同士を結合している例を初めて見たのですが、結構あるものなのですね。マスターできるように頑張ります。

お礼日時:2009/06/29 18:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!