複数のテーブルを結合するSELECT文を実行した際に、以下のエラーが返る場合があります。
ERROR 138 (HY000): IDB-1003: Circular joins are not supported.
Circular join(サーキュラージョイン)とは日本語にすると「循環結合」です。つまり、以下のように検索条件(結合条件)が循環してしまうような結合のことを指します。
サーキュラージョインの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> SELECT a.col1,b.col1,c.col1,d.col1 -> FROM -> t1 AS a, -> t2 AS b, -> t3 AS c, -> t4 AS d -> WHERE -> a.col1 = b.col1 -- 図の①―② -> AND -> b.col1 = c.col1 -- 図の②―③ -> AND -> c.col1 = d.col1 -- 図の③―④ -> AND -> d.col1 = a.col1; -- 図の④―① |
このSQLの場合、下図のようにWHERE句ですべてのテーブルを循環するような条件が指定されています。
① a.col1 <----- ④ d.col1
| ∧
| |
∨ |
② b.col1 -----> ③ c.col1
InfiniDBは現在(2014/8 バージョン4.5以下)、サーキュラージョインをサポートしていないため、このような検索をする場合は、以下のようにSQLを書き換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> SELECT a.col1,b.col1,c.col1,d.col1 -> FROM -> t1 AS a, -> t2 AS b, -> t3 AS c, -> t4 AS d -> WHERE -> a.col1 = b.col1 -> AND -> b.col1 = c.col1 -> AND -> c.col1 = d.col1 -> AND -> d.col1 = a.col1 + 0; |
このように、何れかの条件に「+ 0」を付けることで結合の循環は崩れる(この比較は結合ではなく等価比較とみなされる)ため、エラーとならず正常に処理できます。
※検索結果に影響はありません。