[前][次][番号順一覧][スレッド一覧]

mysql:2359

From: Yokota Takehiko <Yokota Takehiko <takehiko@xxxxxxxxxx>>
Date: Tue, 8 Aug 2000 13:58:26 +0900 (JST)
Subject: [mysql 02359] JOIN の ON 節の制限は?

横田です。

JOIN に関して質問があります。現在、次のような2つのテーブルがありまして、

table a: (primary key: mid)
  mid   cid
---------------------------
    1     1
    2     1
    3     1
    4     2
    5     2
    6     3
    ...

table b: (primary key: (mid, uid))
  mid   uid
---------------------------
    1     1
    2     1
    4     1
    5     1
    1     2
    2     2
    3     2
    ...
    
今、table a において cid==1 であるような mid (1,2,3) について、
uid==1 であるようなレコードが table b に存在しないもの (3) を
求めたいと考えました。

そこで、次のようなSQLを考えてみました。

(1) SELECT * FROM a LEFT OUTER JOIN b
ON a.mid=b.mid AND a.cid=1 AND b.uid=1
WHERE b.uid is NULL

ところが、結果は以下のようになってしまいました。

+-----+-----+------+------+
| mid | cid | mid  | uid  |
+-----+-----+------+------+
|   3 |   1 | NULL | NULL |
|   4 |   2 | NULL | NULL |
|   5 |   2 | NULL | NULL |
|   6 |   3 | NULL | NULL |
+-----+-----+------+------+

それでいくつか試してみましたところ、次のようなSQLで目的が達成できま
した。

(2) SELECT * FROM a LEFT OUTER JOIN b
ON a.mid=b.mid AND b.uid=1
WHERE a.cid=1 AND b.uid is NULL

+-----+-----+------+------+
| mid | cid | mid  | uid  |
+-----+-----+------+------+
|   3 |   1 | NULL | NULL |
+-----+-----+------+------+

そこで質問なのですが、
  ・ON 節には複数の条件式をAND演算子でつないだような式(a.mid=b.mid AND
    a.cid=1 AND b.uid=1 のような)を書いてもよいのか?(mySQLマニュアル
    には、ON conditional_expr と書かれているので、よさそうに思えますが…。)
  ・書いてよいなら、なぜSQL(1)は期待通りの動作をしないのか?仮に、結合
    に関係するフィールドだけしかON節には書いてはいけないのならば、なぜ
    SQL(2)は期待通りの動作をするのか?(たまたま?)
  ・SQL(2)が期待通りの動作をするのがたまたまであって、環境依存で動作が
    不定なSQLならば、どういうSQLを書けば環境に依存せずに期待通りの動作
    をさせることができるのか?

なお、当方の環境は mySQL 3.22.32 + VineLinux2.0 です。

よろしくお願いします。

=------------------------------------------------------------=
      株式会社東芝 研究開発センター
        ヒューマンインターフェースラボラトリー
            横田 健彦  takehiko@xxxxxxxxxx
=------------------------------------------------------------=


[前][次][番号順一覧][スレッド一覧]

->    2359 2000-08-08 13:58 [Yokota Takehiko <tak] JOIN の ON 節の制限は?                 
      2360 2000-08-08 18:06 ┗[とみたまさひろ <tomm]                                       
      2362 2000-08-08 19:12  ┗[Yokota Takehiko <tak]