Ami*_*ahi 1 sql stored-procedures inner-join sql-function
我有这个架构:
当我想显示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
Run Code Online (Sandbox Code Playgroud)
第二种方法是使用函数或存储过程 - 发送id和返回名称
select
a.Id,
FindDoctor(a.DoctorId) as Doctor,
FindPatient(a.PatientId) as Patient,
a.Start, a.EndTime
from
Attend AS a
Run Code Online (Sandbox Code Playgroud)
哪个更好?哪种是优化方法?
通常,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;
Run Code Online (Sandbox Code Playgroud)
有些人喜欢在存储过程中嵌入这样的查询.如果你想封装这个逻辑,我建议使用视图或表值函数.