1

SQL SERVER に 2 つのテーブルがあります。

DBO.VitalPatientDetails=>

| | 患者の詳細 ID | 患者ID | 患者名 | ユニット名 | ベッド名 | 患者DOB | LastAlarmReceivedAt |

DBO.VitalAlarmDetails=>

| | ID | PatientDetailsId (VitalPatientDetails.PatientDetailsId を参照) | バイタルジェネレーションタイム | ファイル名 |

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

わかりましたので、VitalGenerationTime で並べ替えられた単一の結果セットを正しく理解していれば(そして、PatientDetailsId で並べ替えられたカーソルを使用して?

のようなものはどうですか

SELECT  PatientDetailsId,
        VitalGenerationTime
FROM    VitalAlarmDetails
ORDER BY    PatientDetailsId,
            VitalGenerationTime
于 2012-11-01T08:40:26.463 に答える
0

WHILEループを使用して を置き換えてみてくださいCURSOR。私は別のSOの質問に例を投稿しました:

SQL Server ストアド プロシージャ回避カーソル

次のようなものになります。

SELECT @PatientDetailsId = MIN (PatientDetailsId) FROM VitalAlarmDetails
WHILE @PatientDetailsId は NULL ではありません
始める

   ' ここで何かをする

   SELECT @PatientDetailsId = MIN (PatientDetailsId ) FROM VitalAlarmDetails WHERE PatientDetailsId > @PatientDetailsId

終わり

編集:

行ごとに進むのではなく、セットを返すには、次のようなものを使用します。

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

編集2:

JOINそれでも、期待した結果が得られませんでした。WHILEループ内で一時テーブルを使用して結果を保存することをお勧めします。これはうまくいったようです。

于 2012-11-01T08:26:51.590 に答える