Different Scenarios of Using an Inner Join
To understand the different scenarios of using an inner join, let us create a few hierarchical tables and populate them with some data.
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')Join with Descendant Table:
Example 1a:
Parent table A is joined with descendant table B. Note that only the matching rows are returned. The unmatched row from table A with ida 3, is not returned in the output.
                  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 returnedExample 1b:
Parent table A is joined with descendant table C. A descendant table can be any level hierarchically below a table (For example C is the child of B which is the child of A, so C is a descendant of 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 returnedJoin with Ancestor Table:
Example 1a:
Table B is joined with ancestor table 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 returnedMultiple Table Join:
Example 1:
Table C is joined with ancestor tables A and 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 returnedSibling Join:
Example 1:
Table B is joined with sibling table G. Both the tables are children of table 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 returnedJoin with Ancestor and Descendant Tables:
Example 1:
Table B is joined with ancestor A and descendant 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 returnedJoin with Table that is neither an Ancestor nor a Descendant:
Example 1:
Table G is joined with C. Parent of table G is A and parent of table C is B. Table G and C are not in an ancestor-descendant relationship.
               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"}}Join Predicates:
The WHERE clause must contain join predicates on all the shard key columns of all the participating tables, else the query returns an error. In the query below, the shard key of table A is not matched in the join predicate, hence the query returns an error.
               SELECT * FROM A.B b, A a ,A.B.C c WHERE c.ida = b.idaError 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