-1

OneToMany 関係を持つ 2 つのテーブルがあり、テーブル B をターゲットとして左結合を行うと、WHERE 句を使用してテーブル A をターゲットとして左結合を行うよりも役に立たない、本当に良い例はありますか。

Table A (ManyToOne with Table B)
Pk
Number
Fk

Table B
Pk
IsActive

つまり、私はそのように結合を書くことができます

select * from TableA as a left outer join TableB as b on b.pk=a.fk where b.isActive=false and a.Number < 15

書く代わりに

select * from TableB as b left outer join TableA as a on b.pk=a.fk where b.isActive=false and a.Number < 15

つまり、私が noSQL システムで結合をサポートしていた場合、誰かが上記の最初のものとして書き直すことができず、これに適したユースケースがあるので、いつ 2 番目のものをサポートする必要があるのでしょうか。それはいつごろ使用されますか?

私が尋ねる理由は、オブジェクトクエリ言語にあります。この状況でwhere句をサポートする必要があるかどうか疑問に思っています(または、代わりに、このようなことを許可しない場合)...

 select b from TableB as b left fetch join b.tableAList as a where b.isActive=true and a.xxxxx = something

しかし、bには多くのa行があるため、それほど無効ではありません。a.xxxxはリストであるため無効であり、実際にはa.sizeのみであり、これはそのb行の行のリスト内の行数になります。

ありがとう、ディーン

4

1 に答える 1

1

あなたの例はどちらも効果的に内部結合です。

左外部結合を実行すると、2 番目のテーブルの値は NULL になります。あなたの WHERE 句は次のとおりです。

where b.isActive=false and a.Number < 15

NULL 値があるとこれが失敗し、2 番目のテーブルから追加されたすべての「仮想」行が削除されます。

本当に左外部結合が必要な場合は、これらを WHERE 句ではなく ON 句に含める必要があります。

ただし、一般的には、A LEFT OUTER JOIN BB LEFT OUTER JOIN Aはまったく異なります。1 つ目は、A のすべての行を保持し、B の一致する行 (または一致しない場合は NULL 値) を保持します。2 番目は、B のすべての行を保持し、A からの一致するすべての行 (一致がない場合は NULL 値) を保持します。

于 2012-09-13T18:51:03.893 に答える