1

ここに画像の説明を入力

上記は私のスキーマです。tblPatientVisits に表示されないのは、 からの外部キーtblPatient、つまり ですpatientid

tblPatientデータセット内の各患者の個別のコピーとその性別が含まれています。 tblPatientVists入院時に住んでいた場所と通院した病院の人口統計情報が含まれています。その情報はデータ全体で変化するため、別の表に入れることにしました (ある人は、ある訪問から次の訪問に移って、別の病院に行く可能性があります)。

tblPatientVisits を追加するまで、クエリで奇妙な数値を取得することはありません。には 100 万件弱の申し立てがありますが、その人物の出身地を確認できるようtblClaimsに追加すると、100 万件以上が返されます。tblPatientVisitsこれはtblPatientVisits、同じ患者IDが複数回表示されるためだと思います(入院/退院日が異なるため)。

私の人生では、これがどこで間違った設計なのかわかりません。また、 で 1 つのクエリを実行しcount(tblPatientVisits.PatientID=1unionからcount(tblPatientVisits.patientid)>1.

このタイプの設計に関する洞察、またはtblClaimsクレーム ID を患者 ID に関連付けて正しい行数を得るために、クレーム タイプを取得する方法をよりエレガントに見つけるにはどうすればよいでしょうか?

編集:私が抱えている最大の問題は、tblPatient テーブルに admissionDate,dischargeDateまたはを含めると、患者 ID を主キーとして使用できないという事実です。patientState

に必然的に関連してtblClaimsいることに注意する必要があります。NOTtblPatientVisits.admissionDate, tblPatientVisits.dischargeDate

編集: tblPatientVisits が追加されると、要求よりも多くの行が返されることを示すサンプル クエリ

SELECT     tblclaims.id, tblClaims.claimType
FROM         tblClaims INNER JOIN
                      tblPatientClaims ON tblClaims.id = tblPatientClaims.id INNER JOIN
                      tblPatient ON tblPatientClaims.patientid = tblPatient.patientID INNER JOIN
                      tblPatientVisits ON tblPatient.patientID = tblPatientVisits.patientID

100 万を超えるクエリ行が返されました

SELECT     tblClaims.id, tblPatient.patientID
FROM         tblClaims INNER JOIN
                      tblPatientClaims ON tblClaims.id = tblPatientClaims.id INNER JOIN
                      tblPatient ON tblPatientClaims.patientid = tblPatient.patientID

返されるクエリ行は 100 万行未満

サンプル行

100万行以上

4

2 に答える 2

1

これはより良いデザインを求めて泣いていると思います。訪問は請求に関連付けられるべきであり、請求は 1 人の患者にのみ関連付けることができるので、設計は次のようにする必要があると思います (そして、不要なtbl接頭辞を削除すると、煩雑になります):

CREATE TABLE dbo.Patients
(
  PatientID INT PRIMARY KEY
  -- , ... other columns ...
);

CREATE TABLE dbo.Claims
(
  ClaimID INT PRIMARY KEY,
  PatientID INT NOT NULL FOREIGN KEY
    REFERENCES dbo.Patients(PatientID)
  -- , ... other columns ...
);

CREATE TABLE dbo.PatientVisits
(
  PatientID INT NOT NULL FOREIGN KEY
    REFERENCES dbo.Patients(PatientID),
  ClaimID INT NULL FOREIGN KEY 
    REFERENCES dbo.Claims(ClaimID),
  VisitDate DATE
  , -- ... other columns ...
  , PRIMARY KEY (PatientID, ClaimID, VisitDate) -- not convinced on this one
);

ここには冗長な情報がいくつかありますが、モデルからは、患者が特定の請求に関連付けられていない訪問を受けることができるかどうか、または訪問が特定の請求に属していることを知っているかどうかさえ明確ではありません (これは与えられた重要な情報のようです)あなたが求めているクエリのタイプ)。

いずれにせよ、現在のモデルを考えると、次のクエリを試すことができます。

SELECT c.id, c.claimType
FROM dbo.tblClaims AS c
INNER JOIN dbo.tblPatientClaims AS pc
ON c.id = pc.id
INNER JOIN dbo.tblPatient AS p
ON pc.patientid = p.patientID
-- where exists tells SQL server you don't care how many 
-- visits took place, as long as there was at least one:
WHERE EXISTS (SELECT 1 FROM dbo.tblPatientVisits AS pv
  WHERE pv.patientID = p.patientID);

これでも、患者と請求の組み合わせごとに 1 行が返されますが、患者と訪問の組み合わせごとに 1 行しか返されません。繰り返しますが、デザインがここにあるとは思えません。tblまた、テーブル エイリアスを使用する習慣を身に付ける必要があります。特に乱雑なプレフィックスを使用する場合は、クエリが読みやすくなります。また、オブジェクトを作成および参照するときは、常にdbo接頭辞 (または使用するスキーマ) を使用する必要があります。

于 2012-06-18T21:46:16.810 に答える
0

請求の概念を理解しているかどうかはわかりませんが、請求と患者の間のリンク テーブルを削除し、代わりに患者の訪問と請求を関連付けたいと思われます。

それはあなたにとってよりうまくいくでしょうか?

于 2012-06-18T21:32:16.473 に答える