嵌套存在子句与相邻存在子句

时间:2011-09-29 22:00:22

标签: sql-server-2005 tsql

有人可以告诉我这两个问题中哪一个比另一个好,为什么? 我应该使用连接吗?

select * from grandChildTable gct
where exists(
    select * from childTable ct
    where some condition
    and gct.parentId = ct.Id
    and exists(
        select * from Table t
        where some other condition
        and ct.parentId = t.Id))

select * from grandChildTable gct
where exists(
    select * from childTable ct
    where some condition
    and gct.parentId = ct.Id)
and exists(
    select * from Table t
    where some other condition
    and gct.grandParentId = t.Id)

注意: GrandChildTable包含ChildTableTable的ID,因为ID是复合的。

这些表没有任何其他参考。

表之间的关系是:

GrandChild to Child
n:1

Child to Table
n:1

1 个答案:

答案 0 :(得分:0)

在这种情况下(与您的子行数较少的父表相比),使用JOIN可能差别不大。然而,EXISTS通常更快,并证明了这一点。

我还希望优化器为基于2个EXISTS的计划生成相同的计划:examine the query plans并查看是否存在任何差异(同样this Red Gate link)。如果没有,请寻求可读性。