我有这个架构:
如果我想显示Attend
表格,而不是DoctorId
和PatientId
,则会显示员工姓名和患者姓名。
像这样:
第一种方法是使用内连接:
select
a.Id, p.Name, a.Name, a.Start, a.End
from
Patient as p
inner join
(select
e.Name, at.Id, at.Start, at.End, at.PatientId
from
Attend as at
INNER JOIN
Employee as e on at.DoctorId = e.Id) as a on p.Id = a.PatientId
第二种方法是使用函数或存储过程 - 发送id
并返回名称
select
a.Id,
FindDoctor(a.DoctorId) as Doctor,
FindPatient(a.PatientId) as Patient,
a.Start, a.EndTime
from
Attend AS a
哪个更好?哪种是优化方法?
答案 0 :(得分:5)
通常,SQL引擎在优化查询方面比优化函数调用做得更好。我建议你坚持使用查询,至少在开始时。这也使我们更容易理解可能出现的性能问题。
顺便说一句,不需要子查询来做你想做的事情。 SQL Server非常智能,因此它可能不会影响性能。但是,您可以将查询编写为:
select at.Id , p.Name , e.Name , at.Start, at.End
from Patient p inner join
Attend at
on p.Id = at.PatientId inner join
Employee as e
on at.DoctorId = e.Id;
有些人喜欢在存储过程中嵌入此类查询。如果你想封装这个逻辑,我会建议使用视图或表值函数。