LOJの制限事項
Oracle NoSQL DatabaseでLOJを使用する場合、いくつかの制限があります。
兄弟との結合
Oracle NoSQL DatabaseのLOJは兄弟に適用できません。LOJは、直接階層関係のみを持つ表で使用できます。
例6-116 エラー・シナリオ: 兄弟に対するLOJ
兄弟を結合しようとすると、次のエラーが発生します:SELECT * FROM A.B b LEFT OUTER JOIN A.G g ON b.ida=g.ida
出力:Error handling command select * from A.B b LEFT OUTER JOIN A.G g on b.ida=g.ida:
Error: at (1, 40) Table A.G is neither ancestor nor descendant of the target table A.B
LOJの表の順序
単一の文で複数の結合を使用する場合、LOJ内の表は、ターゲット表の後にトップダウンの順序で表示される必要があります。複数の結合操作で子表をその親の左側に配置することはできません。
例6-117 順序が正しくない、親表とその祖先の複数のLOJ
この例では、親表Aをその子孫A.Bの右側に配置することはできないため、エラーがスローされます。
SELECT * FROM A.B.C c LEFT OUTER JOIN A.B b ON c.ida = b.ida and c.idb = b.idb
LEFT OUTER JOIN A a on c.ida = a.ida
出力:Error handling command SELECT * FROM A.B.C c LEFT OUTER JOIN A.B b ON c.ida = b.ida
and c.idb = b.idb LEFT OUTER JOIN A a ON c.ida = a.ida:
Error: at (3, 22) Table A is not descendant of table A.B.
Tables in left-outer-joins must appear in top-down order after the target table
結合述語
LOJでは、右表のON式に、親表と子表をリンクする必要な結合述語すべてを含める必要があります。結合述語がない場合、例外が発生します。
例6-118 右表がターゲット表の祖先である場合は、ON式に、右表の主キー列すべてに対する結合述語が含まれている必要がある
この例では、右表の主キー列idb
に対する結合述語の1つが不足しているため、エラーがスローされます。
SELECT * FROM A.B.C c LEFT OUTER JOIN A a ON c.ida = a.ida
LEFT OUTER JOIN A.B b ON c.ida = b.ida
出力:Error handling command SELECT * FROM A.B.C c LEFT OUTER JOIN A a ON c.ida = a.ida
LEFT OUTER JOIN A.B b ON c.ida = b.ida:
Error: A join predicate is missing from ON clause of table A.B : c.idb = b.idb
例6-119 右表がターゲット表の子孫である場合は、ON式に、左表の主キー列すべてに対する結合述語が含まれている必要がある
この例では、左表の主キー列idb
に対する結合述語の1つが不足しているため、エラーがスローされます。
SELECT * FROM A.B b LEFT OUTER JOIN A.B.C c ON b.ida = c.ida
出力:Error handling command SELECT * FROM A.B b LEFT OUTER JOIN A.B.C c ON b.ida = c.ida:
Error: A join predicate is missing from ON clause of table A.B.C : b.idb = c.idb