我在SQL SERVER中有两个表。
DBO.VitalPatientDetails =>
| PatientDetailsId | PatientId | PatientName | UnitName | BedName | PatientDOB | LastAlarmReceivedAt |
DBO.VitalAlarmDetails =>
| Id | PatientDetailsId(指VitalPatientDetails.PatientDetailsId)| VitalGenerationTime | FileName |
我需要按VitalGenerationTime以升序排序的PatientDetailsId按DBO.VitalAlarmDetails分组。 我已经为此编写了光标,如下所示,它返回多个结果集。我需要在不使用游标的情况下在单集中获取它。我只是想知道我是否可以在没有光标的情况下做到这一点。
DECLARE @PatientDetailsId BIGINT
DECLARE @getAlarmDetails CURSOR
SET @getAlarmDetails = CURSOR FOR SELECT PatientDetailsId FROM VitalPatientDetails
OPEN @getAlarmDetails
FETCH NEXT FROM @getAlarmDetails INTO @PatientDetailsId
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT * FROM VitalAlarmDetails
WHERE PatientDetailsId = @PatientDetailsId
ORDER BY VitalGenerationTime ASC
FETCH NEXT FROM @getAlarmDetails INTO @PatientDetailsId
END
CLOSE @getAlarmDetails
DEALLOCATE @getAlarmDetails
感谢。
答案 0 :(得分:0)
尝试使用WHILE
循环替换CURSOR
。我在另一个SO问题中发布了一个例子:
SQL Server stored procedure avoid cursor
它会变成以下内容:
SELECT @PatientDetailsId = MIN (PatientDetailsId) FROM VitalAlarmDetails WHILE @PatientDetailsId IS NOT NULL BEGIN ' Do stuff here SELECT @PatientDetailsId = MIN (PatientDetailsId ) FROM VitalAlarmDetails WHERE PatientDetailsId > @PatientDetailsId END
编辑:
要返回一个集合而不是逐行进行,请使用以下内容:
SELECT
VAD.*
FROM
VitalAlarmDetails VAD JOIN
VitalPatientDetails VPD ON VAD.PatientDetailsId = VPD.PatientDetailsId
EDIT2:
JOIN
仍未产生预期结果。建议在WHILE
循环内使用临时表来存储结果。这似乎有效。
答案 1 :(得分:0)
好的,如果我理解正确单个结果集,由VitalGenerationTime订购(以及使用由PatientDetailsId订购的游标?
像
这样的东西SELECT PatientDetailsId,
VitalGenerationTime
FROM VitalAlarmDetails
ORDER BY PatientDetailsId,
VitalGenerationTime