如何更好地编写此SQL?
问题描述:
我拥有表格患者,服务,PatientStatus,状态 - 患者可以有多种服务区分的状态。如何更好地编写此SQL?
我想构建一个视图,为每个服务和每个患者显示他们的当前状态,即使他们没有该服务的状态。
我有一些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
答
咄...我1 = 1是一样的重写它作为CROSS JOIN:
从 服务S 交叉连接 患者p
答
我不知道为什么有耐心,服务表之间没有关系?为什么要使用“1 = 1”?
假设PatientService是多对多的关系 ... 服务S 内部联接 (PatientService PS内加入关于ps.PCode = p.Code患者P) 上s.Code = ps.SCode ...
答
如果他们没有该服务的状态,您是否有理由需要行显示患者/服务?看起来这应该是我在前端处理的东西。
也就是说,让你在找什么我可能会使用以下方法:
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为同耐心和服务,那么你会在这里得到重复。尽管如此,您也可以从原始查询中获得这些信息。如果需要,您可以编写代码。只要改变最后一行在PS2的加盟:
(PS2.TsStart > PS.TsStart OR (PS2.TsStart = PS.TsStart AND PS2.pkID > PS.pkID))
你可能会得到更多的帮助,如果你提供的样本数据集,然后你想要什么你的数据看起来像一个例子。我发现在这里让我们的一些SQL专家能够快速解决问题是非常有效的。 – TheTXI 2009-07-16 03:36:10
谢谢 - 我会为未来记住这一点,尽管我很高兴自己解决了这个问题。我主要是一名开发人员,但是拥有足够的SQL技能来大部分时间合理的使用它:) – 2009-07-16 09:42:25