0

別々のテーブルを結合したままにして、特定のレコードのデータベースで最新のPKキーを特定の時点(挿入ポイント)で検出しようとするクエリを作成しました。これが私がそれを機能させることができるように見える唯一の方法であるため、あなたは私がそれをpatientid100に戻したのを見るでしょう。

現在のクエリは次のように機能します。

SELECT TOP 1 P1.PatientID, 
             P1.DimPatientPK, 
             DA1.DimAdmissionPK, 
             DD1.DiagnosisPK, 
             DI1.Investigation1PK, 
             DIE1.InvestigationECGPK, 
             IEG1.InvestigationEchoGoldPK, 
             MH1.DimMedicalHistoryPK, 
             FH1.DimPatientFamilyHistoryPK, 
             PHT1.PatientHospitalisationTreatmentPK, 
             PMP1.PatientMedicalPersonnelPK, 
             RR1.PatientReferralReasonPK, 
             PEA1.PhysicalExamAHSPK, 
             PEM1.PhysicalExamMurmursPK, 
             SI1.SocialIssuePK, 
             TRT.TreatmentPK
--DT1.Treatment1PK          
  FROM
       DimPatient P1 LEFT JOIN DimAdmission DA1 ON P1.PatientID = DA1.PatientID
                     LEFT JOIN DimDiagnosis DD1 ON P1.PatientID = DD1.PatientID
                     LEFT JOIN DimInvestigation1 DI1 ON P1.PatientID = DI1.PatientID
                     LEFT JOIN DimInvestigationECG DIE1 ON P1.PatientID = DIE1.PatientId
                     LEFT JOIN DimInvestigationECHOgold IEG1 ON P1.PatientID = DIE1.PatientId
                     LEFT JOIN DimMedicalHistory MH1 ON P1.PatientID = MH1.PatientId
                     LEFT JOIN DimPatientFamilyHistory FH1 ON P1.PatientId = FH1.PatientID
                     LEFT JOIN DimPatientHospitalisationTreatment PHT1 ON P1.PatientID = PHT1.PatientId
                     LEFT JOIN DimPatientMedicalPersonnel PMP1 ON P1.PatientID = PMP1.PatientId
                     LEFT JOIN DimPatientReferralReason RR1 ON P1.PatientID = RR1.PatientId
                     LEFT JOIN DimPhysicalExamAHS PEA1 ON P1.PatientId = PEA1.PatientId
                     LEFT JOIN DimPhysicalExamination PE1 ON P1.PatientID = PE1.PatientId
                     LEFT JOIN DimPhysicalExamMurmurs PEM1 ON P1.PatientID = PEM1.PatientId
                     LEFT JOIN DimSocialIssue SI1 ON P1.PatientID = SI1.PatientID
                     LEFT JOIN DimTreatment TRT ON P1.PatientID = TRT.PatientId
  WHERE P1.patientid IN(100)
  ORDER BY DA1.DimAdmissionPK DESC, 
           P1.DimPatientPK DESC, 
           DD1.DiagnosisPK DESC, 
           DI1.Investigation1PK DESC, 
           DIE1.InvestigationECGPK DESC, 
           IEG1.InvestigationEchoGoldPK DESC, 
           MH1.DimMedicalHistoryPK DESC, 
           FH1.DimPatientFamilyHistoryPK DESC, 
           PHT1.PatientHospitalisationTreatmentPK DESC, 
           PMP1.PatientMedicalPersonnelPK DESC, 
           RR1.PatientReferralReasonPK DESC, 
           PEA1.PhysicalExamAHSPK DESC, 
           PE1.PhysicalExaminationPK DESC, 
           PEM1.PhysicalExamMurmursPK DESC, 
           SI1.SocialIssuePK DESC, 
           TRT.TreatmentPK DESC;

これにより、patid 100について入力されているかどうかに関係なく、完全なレコードが正常に回復されます。

これを拡張してループし、データベース内のすべての患者に対して同じ結果を収集するのに問題があります。

つまり、where句を削除しても、まだ1行しか取得できません。

select top 1 ..を削除すると、patientid 90の複数のセットが返されます-基本的に、patientIDごとに1行が必要です-つまり、各テーブルの対応する最大キー値が一致する90、91、92です。

誰かがこれを達成する方法について何かアイデアがありますか?

4

2 に答える 2

0

ROW_NUMBER 関数を WHERE 句に追加することをお勧めします。

    WHERE ROW_NUMBER() (PARTION BY P1.patientid ORDER BY DA1.DimAdmissionPK desc,
P1.DimPatientPK desc, ... ) = 1

「...」とは、ORDER BY 句全体を ROW_NUMBER 関数内に移動することを意味します。

頑張ってください - ファクト テーブルが不足しているようです...

于 2012-12-11T01:15:20.150 に答える
0

結合しようとしている 1 つ (または複数) のテーブルが空です。結合を左外部結合に変更します。つまり、

LEFT OUTER JOIN DimAdmission DA1    ON P1.PatientID = DA1.PatientID

結合されたすべてのテーブル。空のテーブルでは、結果セットの列に Null が含まれます。

同じ患者 ID に対して複数の選択が存在する場合、1 つ以上のテーブルに各患者 ID に対して複数のレコードがあります。これらのテーブルをクエリから除外するか、データ構造を調べて、単一のレコードを選択できるフィールドがあるかどうかを確認する必要があります。

于 2012-12-10T11:15:58.630 に答える