找到父行的更好方法是否可删除

时间:2015-02-27 06:50:06

标签: sql sql-server sql-server-2008-r2

我有

ParentTable

 PId - int    
 PDescription - varchar

ChildTable

CId - Int    
CDetails - Varchar    
PId - Int --  Mapped from Parent

我需要在加载数据本身时查找父行是否可删除,因为我不想让用户通过映射删除数据。我的查询在下面

select P.PId,Pdescription,Cast(Count(C.CId) as Bit)^1 "IsDeletable" 
From  ParentTable P
LEFT JOIN ChildTable C On P.Pid=C.Pid
Group By P.PId,Pdescription

这里问题是Child有很多行,执行查询花了很多时间。还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:2)

首先,您应该确保在ChildTable.Pid上有一个索引,然后您可以将查询重写为这样的内容。

select P.Pid,
       P.Pdescription,
       case when exists (
                        select *
                        from dbo.ChildTable as C
                        where P.Pid = C.Pid
                        )
         then cast(0 as bit)
         else cast(1 as bit)
       end as IsDeleteable
from dbo.ParentTable as P;

此查询检查ChildTable中是否存在行,其中查询计算每个父项的行数。检查存在只需要找到一行,并使用索引对ParentTable中的每一行进行一次搜索。

enter image description here