Sql server 在哪里有更好的方法?

Sql server 在哪里有更好的方法?,sql-server,tsql,Sql Server,Tsql,我的SQL有点生疏,只是好奇是否有更好的方法来实现WHERE子句?假设有一种方法,我肯定有。它的运行速度相当快,但我只是不喜欢它,想知道它是否可以改进 SELECT DISTINCT p.firstname , p.middlename , p.lastname , p.gender , p.

我的SQL有点生疏,只是好奇是否有更好的方法来实现WHERE子句?假设有一种方法,我肯定有。它的运行速度相当快,但我只是不喜欢它,想知道它是否可以改进

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的自引用。