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]