如何在不使用光标的情况下一次选择一条记录?

时间:2012-11-01 08:23:17

标签: sql sql-server sql-server-2008 sql-server-2005

我在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

感谢。

2 个答案:

答案 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