LOJの制限事項
Oracle NoSQL DatabaseでLOJを使用する場合、いくつかの制限があります。
兄弟との結合
Oracle NoSQL DatabaseのLOJは兄弟に適用できません。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内の表は、ターゲット表の後にトップダウンの順序で表示される必要があります。複数の結合操作で子表をその親の左側に配置することはできません。
例: 順序が正しくない親表の複数の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式に、親表と子表をリンクするすべての必要な結合述語を含める必要があります。結合述語がない場合、例外が発生します。
例1: 右表がターゲット表の祖先である場合、ON式には右表のすべての主キー列の結合述語が含まれている必要があります。
次の例では、右表の主キー列idbに対する結合述語のいずれかが欠落しているため、エラーがスローされます。
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
例2: 右表がターゲット表の子孫である場合、ON式には左表のすべての主キー列の結合述語が含まれている必要があります。
次の例では、左表の主キー列idbに対する結合述語のいずれかが欠落しているため、エラーがスローされます。
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