代码之家  ›  专栏  ›  技术社区  ›  Craig Shearer

如何才能更好地编写此sql?

  •  0
  • Craig Shearer  · 技术社区  · 17 年前

    我有表patient,service,patient status,status-一个病人可以有多个被服务区分的状态。

    我想建立一个视图,显示每个服务和每个患者的当前状态,即使他们没有该服务的状态。

    我有一些SQL可以做到这一点,但我能写得更好吗?(我主要关心1=1的病人的内部连接)

    下面是SQL:

    select
        p.Code,
        s.pkServiceId, 
        ps.fkPatientId, 
        ps.fkStatusId, 
        s.Code AS ServiceCode, 
        s.Description AS ServiceDescription, 
        st.Code AS StatusCode, 
        st.Description as StatusDescription, 
        ps.TsStart
    from 
        Service s
    inner join
        Patient p on 1 = 1
    left outer join
          (select
                max(TsStart) AS TsStart, 
                fkPatientId, 
                fkServiceId
            from
                PatientStatus AS ps
            group by
                fkServiceId, fkPatientId
         ) AS psLast on 
            psLast.fkServiceId = s.pkServiceId and 
            psLast.fkPatientId = p.pkPatientId
    left outer join
        PatientStatus AS ps ON 
            psLast.TsStart = ps.TsStart and 
            psLast.fkPatientId = ps.fkPatientId and 
            psLast.fkServiceId = ps.fkServiceId 
    left outer join
        Status st on
            st.pkStatusId = ps.fkStatusId
    
    3 回复  |  直到 17 年前
        1
  •  4
  •   Craig Shearer    17 年前

    嗯……My 1=1与将其重写为交叉连接相同:

    从 服务 交叉连接 病人P

        2
  •  1
  •   Tom H zenazn    17 年前

    如果患者/服务没有该服务的状态,您是否需要这些行显示出来?对我来说,这似乎应该是在前端处理的事情。

    也就是说,为了得到你想要的东西,我可能会使用以下方法:

    SELECT
        P.Code,
        S.pkServiceID,  --Ugh, I hate that naming convention
        PS.fkPatientID,
        PS.fkStatusID,
        S.Code AS ServiceCode,
        S.Description AS ServiceDescription,
        ST.Code AS StatusCode,
        ST.Description AS StatusDescription
        PS.TsStart
    FROM
        Patient P
    CROSS JOIN Service S
    LEFT OUTER JOIN PatientStatus PS ON
        PS.fkPatientID = P.pkPatientID AND
        PS.fkServiceID = S.pkServiceID
    LEFT OUTER JOIN PatientStatusPS2 ON
        PS2.fkPatientID = P.pkPatientID AND
        PS2.fkServiceID = S.pkServiceID AND
        PS2.TsStart > PS.TsStart
    LEFT OUTER JOIN Status ST ON
        ST.pkStatusID = PS.fkStatusID
    WHERE
        PS2.fkPatientID IS NULL
    

    只是一个简短的便条…如果您有两种状态,对于同一患者和服务具有完全相同的tsstart,那么您将在这里获得重复的tsstart。不过,您也可以从原始查询中获取这些信息。如果需要的话,你可以为它编码。只需将ps2上连接的最后一行更改为:

    (PS2.TsStart > PS.TsStart OR (PS2.TsStart = PS.TsStart AND PS2.pkID > PS.pkID))
    
        3
  •  0
  •   thethanghn    17 年前

    我想知道为什么病人和服务台之间没有关系?为什么要用“1=1”?

    假设病人服务是多对多关系 … 服务 内部连接 (patientservice ps inner join patient p on ps.p code=p.code) 在s.code=ps.scode上 …