内部結合を使用する様々なシナリオ

内部結合を使用する様々なシナリオを理解するために、いくつかの階層表を作成し、それらにデータを移入してみましょう。

CREATE TABLE IF NOT EXISTS A (
        ida INTEGER,
        a1 string,
        PRIMARY KEY(ida))

CREATE TABLE IF NOT EXISTS A.B (
        idb INTEGER,
        b1 string,
        PRIMARY KEY(idb))

CREATE TABLE IF NOT EXISTS A.B.C (
        idc INTEGER,
        c1 string,
        PRIMARY KEY(idc))

CREATE TABLE IF NOT EXISTS A.G (
        idg INTEGER,
        g1 string,
        PRIMARY KEY(idg))

INSERT INTO A VALUES(1, 'a1')
INSERT INTO A VALUES(2, 'a2')
INSERT INTO A VALUES(3, 'a3')
INSERT INTO A.B VALUES(1, 1, 'b1')
INSERT INTO A.B VALUES(2, 2, 'b2')
INSERT INTO A.B.C VALUES(1, 1, 1, 'c1')
INSERT INTO A.B.C VALUES(2, 2, 1, 'c2')
INSERT INTO A.B.C VALUES(3, 3, 1, 'c3')
INSERT INTO A.G VALUES(1, 1, 'g1')
INSERT INTO A.G VALUES(2, 2, 'g2')

子孫表との結合:

例1a:

親表Aが子孫表Bと結合されます。一致する行のみが返されます。表Aの一致しない行(ida 3)は、出力に返されません。
SELECT * FROM A a, A.B b WHERE a.ida = b.ida ORDER BY a.ida
出力:
{"a":{"ida":1,"a1":"a1"},"b":{"ida":1,"idb":1,"b1":"b1"}}
{"a":{"ida":2,"a1":"a2"},"b":{"ida":2,"idb":2,"b1":"b2"}}

2 rows returned

例1b:

親表Aが子孫表Cと結合されます。子孫表は、ある表の下の任意のレベルにすることができます(たとえば、CはBの子で、BはAの子なので、CはAの子孫など)。
SELECT * FROM A a, A.B.C c WHERE a.ida = c.ida ORDER BY a.ida
出力:
{"a":{"ida":1,"a1":"a1"},"c":{"ida":1,"idb":1,"idc":1,"c1":"c1"}}
{"a":{"ida":2,"a1":"a2"},"c":{"ida":2,"idb":2,"idc":1,"c1":"c2"}}
{"a":{"ida":3,"a1":"a3"},"c":{"ida":3,"idb":3,"idc":1,"c1":"c3"}}

 3 rows returned

祖先表との結合:

例1a:

表Bが祖先表Aと結合されます。
SELECT * FROM A.B b, A a WHERE a.ida = b.ida ORDER BY a.ida
出力:
{"b":{"ida":1,"idb":1,"b1":"b1"},"a":{"ida":1,"a1":"a1"}}
{"b":{"ida":2,"idb":2,"b1":"b2"},"a":{"ida":2,"a1":"a2"}}

2 rows returned

複数の表の結合:

例1:

表Cが祖先表AおよびBと結合されます。
SELECT * FROM A.B.C c, A a ,A.B b WHERE c.ida = b.ida AND c.ida = a.ida ORDER BY c.ida, c.idb
出力:
{"c":{"ida":1,"idb":1,"idc":1,"c1":"c1"},"a":{"ida":1,"a1":"a1"},"b":{"ida":1,"idb":1,"b1":"b1"}}
{"c":{"ida":2,"idb":2,"idc":1,"c1":"c2"},"a":{"ida":2,"a1":"a2"},"b":{"ida":2,"idb":2,"b1":"b2"}}

2 rows returned

兄弟結合:

例1:

表Bが兄弟表Gと結合されます。どちらの表も表Aの子です。
SELECT * FROM A.B b,A.G g WHERE b.ida=g.ida
出力:
{"b":{"ida":2,"idb":2,"b1":"b2"},"g":{"ida":2,"idg":2,"g1":"g2"}}
{"b":{"ida":1,"idb":1,"b1":"b1"},"g":{"ida":1,"idg":1,"g1":"g1"}}

2 rows returned

祖先表および子孫表との結合:

例1:

表Bが祖先Aおよび子孫Cと結合されます。
SELECT * FROM A.B b ,A a ,A.B.C c WHERE c.ida = a.ida AND b.ida = a.ida
出力:
{"b":{"ida":1,"idb":1,"b1":"b1"},"a":{"ida":1,"a1":"a1"},"c":{"ida":1,"idb":1,"idc":1,"c1":"c1"}}
{"b":{"ida":2,"idb":2,"b1":"b2"},"a":{"ida":2,"a1":"a2"},"c":{"ida":2,"idb":2,"idc":1,"c1":"c2"}}

2 rows returned

祖先でも子孫でもない表との結合:

例1:

表GがCと結合されます。表Gの親はAで、表Cの親はBです。表GとCは、祖先と子孫の関係にはありません。
SELECT * FROM A.G g, A.B.C c WHERE g.ida=c.ida
出力:
{"g":{"ida":1,"idg":1,"g1":"g1"},"c":{"ida":1,"idb":1,"idc":1,"c1":"c1"}}
{"g":{"ida":2,"idg":2,"g1":"g2"},"c":{"ida":2,"idb":2,"idc":1,"c1":"c2"}}

結合述語:

WHERE句には、使用するすべての表のすべてのシャード・キー列に対する結合述語が含まれている必要があります。そうでない場合、問合せはエラーを返します。次の問合せでは、表Aのシャード・キーが結合述語で一致しないため、問合せはエラーを返します。
SELECT * FROM A.B b, A a ,A.B.C c WHERE c.ida = b.ida
出力:
Error handling command SELECT * FROM A.B b ,A a ,A.B.C c WHERE c.ida = b.ida: Error: at (1, 0) Tables are not joined on their common shard key