1

私の 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
4

4 に答える 4

5

最初にサブクエリから値を取得し、それを変数に入れることができます。

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
于 2012-09-07T15:33:02.943 に答える
1

s は、節で参照される方法により、効果的に s に変換LEFT OUTER JOINされます。これは論理的に同等であることがわかると思います。INNER JOINWHERE

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して変数をキャプチャすると、問題が解決するはずです。

于 2012-09-07T17:25:57.223 に答える
0

これは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
于 2012-09-07T16:50:07.073 に答える
0

where条件で同じ条件を2回使用しているのはなぜですか? 2回目は別のIDを使うつもりだったのですか?

副選択なしで、プラクティス テーブルに対して結合し、そこで where 条件を実行しないのはなぜですか?

于 2012-09-07T15:34:10.323 に答える