Sql server 在哪里有更好的方法?
我的SQL有点生疏,只是好奇是否有更好的方法来实现WHERE子句?假设有一种方法,我肯定有。它的运行速度相当快,但我只是不喜欢它,想知道它是否可以改进Sql server 在哪里有更好的方法?,sql-server,tsql,Sql Server,Tsql,我的SQL有点生疏,只是好奇是否有更好的方法来实现WHERE子句?假设有一种方法,我肯定有。它的运行速度相当快,但我只是不喜欢它,想知道它是否可以改进 SELECT DISTINCT p.firstname , p.middlename , p.lastname , p.gender , p.
SELECT DISTINCT p.firstname ,
p.middlename ,
p.lastname ,
p.gender ,
p.dob ,
p.id AS patientid ,
pr.id AS practiceid ,
pr.[name] AS practicename,
pr.parentaco ,
pp.encounterdate
FROM ((aco.patients_practices patients_practices
LEFT OUTER JOIN aco.patients p
ON (
patients_practices.patientid = p.id
)
)
LEFT OUTER JOIN aco.practices pr
ON (
patients_practices.practiceid = pr.id
)
)
INNER JOIN aco.patientpreferences pp
ON (
pp.patientid = p.id
)
WHERE (
pr.parentaco =
(SELECT parentaco
FROM aco.practices
WHERE master_companyid = 763
)
OR pr.id =
(SELECT parentaco
FROM aco.practices
WHERE master_companyid = 763
)
)
AND pp.encounterdate IS NOT NULL
您可以首先从子查询中获取值并将其放入变量中
DECLARE @P INT
SELECT @P = parentaco
FROM aco.practices
WHERE master_companyid = 763
在查询中使用变量
WHERE (pr.parentaco = @P or pr.id = @P) AND
pp.encounterdate IS NOT NULL
您可以首先从子查询中获取值并将其放入变量中
DECLARE @P INT
SELECT @P = parentaco
FROM aco.practices
WHERE master_companyid = 763
在查询中使用变量
WHERE (pr.parentaco = @P or pr.id = @P) AND
pp.encounterdate IS NOT NULL
为什么在where条件下使用相同的条件两次?你是不是想第二次用不同的身份证
为什么不直接加入实践表,然后在那里执行where条件,而不使用子选择?为什么在where条件中使用相同的条件两次?你是不是想第二次用不同的身份证
为什么不直接加入实践表,然后在那里执行where条件,而不使用subselect?这可能不是100%,但希望能引导您在正确的条件下进行操作
SELECT DISTINCT p.firstname ,
p.middlename ,
p.lastname ,
p.gender ,
p.dob ,
p.id AS patientid ,
pr.id AS practiceid ,
pr.[name] AS practicename,
pr.parentaco ,
pp.encounterdate
FROM aco.patients_practices pp
LEFT OUTER JOIN aco.patients p
ON pp.patientid = p.id
LEFT OUTER JOIN aco.practices pr
ON pp.practiceid = pr.id
AND ( pr.parentaco = pp.parentco or pr.id = pp.parentco )
WHERE pp.encounterdate IS NOT NULL
AND pp.master_companyid = 763
这可能不是100%,但希望能引导你在正确的条件下前进
SELECT DISTINCT p.firstname ,
p.middlename ,
p.lastname ,
p.gender ,
p.dob ,
p.id AS patientid ,
pr.id AS practiceid ,
pr.[name] AS practicename,
pr.parentaco ,
pp.encounterdate
FROM aco.patients_practices pp
LEFT OUTER JOIN aco.patients p
ON pp.patientid = p.id
LEFT OUTER JOIN aco.practices pr
ON pp.practiceid = pr.id
AND ( pr.parentaco = pp.parentco or pr.id = pp.parentco )
WHERE pp.encounterdate IS NOT NULL
AND pp.master_companyid = 763
由于
WHERE
子句中引用的方式,左侧外部联接s有效地转换为内部联接
s。我想你会发现这在逻辑上是等价的:
select distinct p.firstname, p.middlename, p.lastname,
p.gender, p.dob, p.id as patientid,
pr.id as practiceid, pr.[name] as practicename, pr.parentaco,
pp.encounterdate
from aco.patients_practices as patients_practices inner join
aco.patients as p on p.id = patients_practices.patientid inner join
aco.practices as pr on pr.id = patients_practices.practiceid inner join
aco.patientpreferences as pp on pp.patientid = p.id
where pp.encounterdate is not null and
( pr.parentaco = ( select parentaco from aco.practices where master_companyid = 763 ) or
pr.id = ( select parentaco from aco.practices where master_companyid = 763 ) )
关于
WHERE
子句中的重复子查询:查询优化器应该识别重复并相应地处理它。您可以通过检查执行计划来确认这一点。使用Mikael Eriksson的建议捕获变量中的parentaco
应该可以解决这个问题。由于WHERE
子句中引用的方式,左外部联接
有效地转换为内部联接
s。我想你会发现这在逻辑上是等价的:
select distinct p.firstname, p.middlename, p.lastname,
p.gender, p.dob, p.id as patientid,
pr.id as practiceid, pr.[name] as practicename, pr.parentaco,
pp.encounterdate
from aco.patients_practices as patients_practices inner join
aco.patients as p on p.id = patients_practices.patientid inner join
aco.practices as pr on pr.id = patients_practices.practiceid inner join
aco.patientpreferences as pp on pp.patientid = p.id
where pp.encounterdate is not null and
( pr.parentaco = ( select parentaco from aco.practices where master_companyid = 763 ) or
pr.id = ( select parentaco from aco.practices where master_companyid = 763 ) )
关于
WHERE
子句中的重复子查询:查询优化器应该识别重复并相应地处理它。您可以通过检查执行计划来确认这一点。使用Mikael Eriksson的建议捕获变量中的parentaco
,应该可以解决问题。master\u companyid是否有唯一的约束?没有,因为它可能有许多子代。这是Master_Company表中的FK。您在WHERE
子句中对pr
的引用有效地将左侧外部连接转换为内部连接。尾随的internal
join也没有帮助。@哈波,你怎么写?你正在加入aco。patients\u的做法与别名patients\u的做法和别名pp的做法相同,但一个连接是外部的,一个是内部的。master\u companyid
有唯一的约束吗?没有,因为它可以有许多子级。这是Master_Company表中的FK。您在WHERE
子句中对pr
的引用有效地将左侧外部连接转换为内部连接。尾随的internal
join也帮不上忙。@哈博,你怎么写?你正在加入aco。patients\u的做法与alias patients\u的做法和alias pp的做法相同,但一个连接是外部的,一个是内部的。这不完全相同。一个在看parentaco,另一个在看parentaco。parentaco是父子关系的自引用id。它不完全相同。一个正在查看parentaco另一个id。parentaco是父子关系的id的自引用。