1

在此处输入图像描述

以上是我的架构。您在 tblPatientVisits 中看不到的是来自 的外键tblPatient,即patientid.

tblPatient包含数据集中每个患者的不同副本以及他们的性别。 tblPatientVists包含他们的人口统计信息,他们在入院时住在哪里以及他们去了哪家医院。我选择将这些信息放入一个单独的表中,因为它在整个数据中都会发生变化(一个人可以从一次访问转移到下一次访问并转到另一家医院)。

在我添加 tblPatientVisits 之前,我的查询没有收到任何奇怪的数字。中只有不到一百万的索赔tblClaims,但是当我添加tblPatientVisits以便我可以查看那个人来自哪里时,它返回了超过一百万。我认为这是因为在tblPatientVisits同一个患者 ID 中出现了不止一次(因为他们有不同的入院/出院日期)。

在我的一生中,我看不出这是不正确的设计,我也不知道如何纠正它,除了使用count(tblPatientVisits.PatientID=1然后union使用count(tblPatientVisits.patientid)>1.

对这种类型的设计有任何见解,或者我如何更优雅地找到一种方法来获取 claimTypetblClaims以给我正确的行数,并将索赔 ID 与患者 ID 相关联?

编辑:我遇到的最大问题是,如果我在 tblPatient 表中包含admissionDate,dischargeDateor ,patientState我就不能使用 patientID 作为主键。

需要注意的是,tblClaimsNOT必然相关tblPatientVisits.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

返回超过一百万的查询行

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

返回的查询行数少于一百万

样本行

超过一百万行

4

2 回答 2

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);

这仍将为每个患者/索赔组合返回一行,但它应该只为每个患者/就诊组合返回一行。再一次,真的感觉设计不在这里。您还应该养成使用表别名的习惯——它们使您的查询更容易阅读,特别是如果您坚持使用凌乱的tbl前缀。dbo在创建和引用对象时,您还应该始终使用(或您使用的任何模式)前缀。

于 2012-06-18T21:46:16.810 回答
0

我不确定我是否理解索赔的概念,但我怀疑您想删除索赔和患者之间的链接表,而是在患者就诊和索赔之间建立关联。

这对你会更好吗?

于 2012-06-18T21:32:16.473 回答