1

我在 SQL SERVER 中有两个表。

DBO.VitalPatientDetails=>

| 患者详细信息 ID | 患者 ID | 患者姓名 | 单位名称 | 床名 | 患者出生日期 | 上次警报接收时间 |

DBO.VitalAlarmDetails=>

| 身份证 | PatientDetailsId(指 VitalPatientDetails.PatientDetailsId)| VitalGenerationTime | 文件名 |

我需要检索按 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

谢谢。

4

2 回答 2

0

尝试使用WHILE循环替换CURSOR. 我在另一个 SO 问题中发布了一个示例:

SQL Server 存储过程避免游标

它会变成如下所示:

从 VitalAlarmDetails 中选择 @PatientDetailsId = MIN (PatientDetailsId)
而@PatientDetailsId 不为空
开始

   ' 在这里做事

   从 VitalAlarmDetails 中选择 @PatientDetailsId = MIN (PatientDetailsId),其中 PatientDetailsId > @PatientDetailsId

结尾

编辑:

要返回一个集合而不是逐行访问它,请使用以下内容:

SELECT 
    VAD.*
FROM 
VitalAlarmDetails VAD JOIN
        VitalPatientDetails VPD ON VAD.PatientDetailsId  = VPD.PatientDetailsId 

编辑2:

JOIN仍然没有产生预期的结果。WHILE建议在循环内使用临时表来存储结果。这似乎奏效了。

于 2012-11-01T08:26:51.590 回答
0

好的,所以如果我正确理解您的单个结果集,按 VitalGenerationTime 排序(以及使用 PatientDetailsId 排序的游标?

像这样的东西怎么样

SELECT  PatientDetailsId,
        VitalGenerationTime
FROM    VitalAlarmDetails
ORDER BY    PatientDetailsId,
            VitalGenerationTime
于 2012-11-01T08:40:26.463 回答