環境: MS SQL Server 2008。
次の 2 つのクエリがあります。1 つは 891 行を返しますが、これは間違っています。もう 1 つは正しい結果サイズである 49 行を返します。どちらのクエリも 2 つのサブクエリを使用し、サブクエリの順序が反転することを除いて、基本的に同じです。
次のようにコメントされEntitlements
たサブクエリは、ログインしているユーザーが他のサブクエリを表示する資格がある行を返し、ユーザーの検索基準によってさらに制限します。
結果セットのサイズが異なる理由を誰か説明してもらえますか?
Entitlement
a を使用したサブクエリと、フェッチプロセスの最後で結果をフィルタリングするように機能するleft outer join
という事実に関係していると思います。where clause
しかし、よくわかりません。
クエリ 1 (間違った結果セット):
select
this_.PROFILE_ID as y0_,
personalda1_.lastName as y1_,
personalda1_.fullName as y2_
from
PROFILE this_
inner join
PERSONALDATA personalda1_
on this_.PERSONALDATA_ID=personalda1_.PERSONALDATA_ID
where
this_.PROFILE_ID in (
/* Entitlements */ select
this_.PROFILE_ID as y0_
from
PROFILE this_
left outer join
APPOINTMENTDETAILS appointmen1_
on this_.PROFILE_ID=appointmen1_.PROFILE_ID
left outer join
OTHERAPPOINTMENT othera2_
on this_.PROFILE_ID=othera2_.PROFILE_ID
where
(
appointmen1_.orgUnit='00000177'
or othera2_.organizationUnit='00000177'
)
)
and this_.PROFILE_ID in (
/* criteria query */ select
distinct this_.PROFILE_ID as y0_
from
PROFILE this_
inner join
APPOINTMENTDETAILS appointmen1_
on this_.PROFILE_ID=appointmen1_.PROFILE_ID
where
appointmen1_.endDate='9999-12-31'
and appointmen1_.area='ABCD'
)
order by
personalda1_.lastName asc;
クエリ 2 (正しい結果セット):
select
this_.PROFILE_ID as y0_,
personalda1_.lastName as y1_,
personalda1_.fullName as y2_
from
PROFILE this_
inner join
PERSONALDATA personalda1_
on this_.PERSONALDATA_ID=personalda1_.PERSONALDATA_ID
where
this_.PROFILE_ID in (
select
distinct this_.PROFILE_ID as y0_
from
PROFILE this_
inner join
APPOINTMENTDETAILS appointmen1_
on this_.PROFILE_ID=appointmen1_.PROFILE_ID
where
appointmen1_.endDate='9999-12-31'
and appointmen1_.area='ABCD'
)
and this_.PROFILE_ID in (
/* Entitlements */ select
this_.PROFILE_ID as y0_
from
PROFILE this_
left outer join
APPOINTMENTDETAILS appointmen1_
on this_.PROFILE_ID=appointmen1_.PROFILE_ID
left outer join
OTHERAPPOINTMENT other2_
on this_.PROFILE_ID=other2_.PROFILE_ID
where
(
appointmen1_.orgUnit='00000177'
or other2_.organizationUnit='00000177'
)
)
order by
personalda1_.lastName asc;
クエリの実行計画を理解しようとしていますが、従うのは簡単ではありません。どんな助けでも大歓迎です。