我有
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有很多行,执行查询花了很多时间。还有其他更好的方法吗?
答案 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
中的每一行进行一次搜索。