SQL Server 2008 - 需要更新SQL帮助

时间:2012-12-28 16:50:31

标签: sql sql-server-2008 tsql

首先,SQL是由服务器动态处理的,因此我的WHERE子句中的某些项可能看起来很奇怪,请忽略它们,因为它们不是问题。

根据我的客户要求,他们需要UNION在其他两个条件下我的更新报告(/ 没有患者就诊的患者 /)和/(没有预约的患者 /)。我需要帮助将这两个子集的患者添加到我的最终更新查询中。在目前的状态下,它只在#Temp患者中加入,我需要将其他患者纳入其中。

非常感谢任何帮助。

我当前的SQL更新 -

DECLARE @Inactive INT
DECLARE @Active INT
DECLARE @PatientProfileId INT

SELECT
    @Inactive = MedlistsId
FROM
    Medlists
WHERE
    TableName = 'PatientProfileStatus'
    AND Code = 'I'

SELECT
    @Active = MedlistsId
FROM
    Medlists
WHERE
    TableName = 'PatientProfileStatus'
    AND Code = 'A'

CREATE TABLE #Temp
    (
      PatientName VARCHAR(120) ,
      PatientProfileId INT ,
      RecentId INT ,
      Recent DATETIME
    )

INSERT  INTO #Temp
        SELECT
            dbo.FormatName(pp.Prefix , pp.First , pp.Middle , pp.Last , pp.Suffix) AS Name ,
            pp.PatientProfileId ,
            MAX(pv.PatientVisitId) AS RecentId ,
            MAX(pv.Visit) AS Recent
        FROM
            PatientVisit pv
            INNER JOIN PatientProfile pp ON pv.PatientProfileId = pp.PatientProfileId
                                            AND pp.PatientStatusMId = @Active
        WHERE
            pp.PatientProfileId IN ( SELECT
                                        a.OwnerId
                                     FROM
                                        Appointments a
                                        INNER JOIN PatientProfile pp ON a.OwnerId = pp.PatientProfileId
                                                                        AND a.ApptKind = 1
                                                                        AND pp.PatientStatusMId = @Active
                                     GROUP BY
                                        a.OwnerId ,
                                        a.ApptKind
                                     HAVING
                                        MAX(a.ApptStart) < '07/30/2005' )
        GROUP BY
            dbo.FormatName(pp.Prefix , pp.First , pp.Middle , pp.Last , pp.Suffix) ,
            pp.PatientProfileId
        HAVING
            MAX(pv.Visit) < '07/30/2005' 

/*Patients without a Appointment*/

IF 1 = 1 
    INSERT  INTO #Temp
            SELECT
                dbo.FormatName(pp.Prefix , pp.First , pp.Middle , pp.Last , pp.Suffix) AS Name ,
                pp.PatientProfileId ,
                NULL AS RecentId ,
                NULL AS Recent
            FROM
                PatientProfile pp
                LEFT JOIN ( SELECT * FROM Medlists WHERE TableName = 'PatientProfileStatus' ) ml1 ON pp.PatientStatusMId = ml1.MedlistsId
                LEFT JOIN Appointments a ON a.Ownerid = pp.PatientProfileId
                                            AND a.ApptKind = 1
                LEFT JOIN PatientVisit pv ON a.PatientVisitId = pv.PatientVisitId
            WHERE
                ml1.Code = 'A'
                AND a.ownerid IS NULL
                AND --Filter on Age
                (
                  ((
                     '-1' = '-1'
                     AND '40' = '125'
                   )
                  OR ( CAST(( DATEDIFF(DAY , pp.Birthdate , GETDATE()) / 365.25 ) AS INT) BETWEEN ( '-1' ) AND ( '40' ) ))
                )

/*Patients without a Patient Visit*/

IF 0 = 1 
    INSERT  INTO #Temp
            SELECT
                dbo.FormatName(pp.Prefix , pp.First , pp.Middle , pp.Last , pp.Suffix) AS Name ,
                pp.PatientProfileId ,
                NULL AS RecentId ,
                NULL AS Recent
            FROM
                PatientProfile pp
                LEFT JOIN PatientVisit pv ON pv.PatientProfileid = pp.PatientProfileid
                LEFT JOIN ( SELECT * FROM Medlists WHERE TableName = 'PatientProfileStatus' ) ml1 ON pp.PatientStatusMId = ml1.MedlistsId
            WHERE
                ml1.Code = 'A'
                AND pv.patientprofileid IS NULL
                AND --Filter on Age
                (
                  ((
                     '-1' = '-1'
                     AND '40' = '125'
                   )
                  OR ( CAST(( DATEDIFF(DAY , pp.Birthdate , GETDATE()) / 365.25 ) AS INT) BETWEEN ( '-1' ) AND ( '40' ) ))
                )   

DECLARE curPatient CURSOR FORWARD_ONLY READ_ONLY LOCAL
FOR
    SELECT
        t.PatientProfileId
    FROM
        #Temp t
        JOIN PatientProfile pp ON t.PatientProfileId = pp.PatientProfileId
        JOIN PatientVisit pv ON pp.PatientProfileId = pv.PatientProfileId
                                AND pv.PatientVisitId = t.RecentId
    WHERE
        --Filter on Age
        (
          ((
             '-1' = '-1'
             AND '40' = '125'
           )
          OR ( CAST(( DATEDIFF(DAY , pp.Birthdate , GETDATE()) / 365.25 ) AS INT) BETWEEN ( '-1' ) AND ( '40' ) ))
        )

OPEN curPatient
FETCH NEXT FROM curPatient INTO @PatientProfileId

WHILE @@FETCH_STATUS = 0 
    BEGIN  

        UPDATE
            PatientProfile
        SET 
            PatientStatusMId = @Inactive ,
            pstatus = 'I'
        FROM
            PatientProfile P
            INNER JOIN #Temp t ON t.PatientProfileID = P.PatientProfileID
        WHERE
            p.PatientProfileId = @PatientProfileId 


        FETCH NEXT FROM curPatient INTO @PatientProfileId 
    END 

CLOSE curPatient
DEALLOCATE curPatient   

DROP TABLE #Temp

1 个答案:

答案 0 :(得分:0)

这将限制约会患者

LEFT JOIN Appointments a 
       ON a.Ownerid = pp.PatientProfileId
      AND a.ApptKind = 1

这将限制访问的患者

LEFT JOIN PatientVisit pv 
       ON pv.PatientProfileid = pp.PatientProfileid

尝试

LEFT OUTER JOIN Appointments a 
           ON a.Ownerid = pp.PatientProfileId
          AND a.ApptKind = 1
Where a.Ownerid is null


LEFT OUTER JOIN PatientVisit pv 
       ON pv.PatientProfileid = pp.PatientProfileid
Where pv.PatientProfileid is null
相关问题