这两个查询之间有什么区别; 891对49结果

时间:2013-01-28 12:44:42

标签: sql sql-server-2008 subquery left-join

环境: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;

尝试理解查询执行计划但不容易理解。 任何帮助将不胜感激。

2 个答案:

答案 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上运行时,两者都会产生相同的结果。