环境:MS SQL Server 2008。
我有以下两个查询,一个返回891行,这是错误的,另外49个,正确的结果大小。两个查询都使用两个子查询,除了翻转子查询的顺序外,它们基本相同。
注释为Entitlements
的子查询返回登录用户有权查看其他子查询的行,这些行进一步受用户搜索条件的限制。
有人可以解释为什么结果集大小不同吗?
我认为它与使用Entitlement
的{{1}}子查询以及left outer join
用于在获取过程的最后过滤结果的事实有关。但不确定。
查询1(错误的结果集):
where clause
查询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 (
/* 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;
尝试理解查询执行计划但不容易理解。 任何帮助将不胜感激。
答案 0 :(得分:0)
转到“错误”结果并找到应该不返回的记录。试着找出它被包含的原因,你可能会发现问题。
此外,您不需要子查询中的distinct
。
另外:这与正确的查询相同吗?
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
appointmen1_.endDate='9999-12-31'
AND
appointmen1_.area='ABCD'
)
答案 1 :(得分:0)
我发现了问题,列出了帮助其他人处于相同情况:
R2
,与MS SQLServer2008 R2
一样。
原来一个服务器是普通的SQLServer 2008
,没有安装R2
,另一个是R2
。
当这些查询在R2
上运行时,两者都会产生相同的结果。