以上是我的架构。您在tblPatientVisits中看不到的是来自tblPatient
的外键,即patientid
。
tblPatient
包含数据集中每位患者的不同副本及其性别。 tblPatientVists
包含他们的人口统计信息,他们在入院时居住的地方以及他们去过的医院。我选择将这些信息放入一个单独的表中,因为它会在整个数据中发生变化(一个人可以从一次访问转移到另一次访问并转到另一家医院)。
在添加tblPatientVisits之前,我的查询没有任何奇怪的数字。在tblClaims
中只有不到一百万的索赔,但是当我添加tblPatientVisits
以便我可以查看该人的来源时,它会返回超过百万。我认为这是因为在tblPatientVisits
中,同一名患者ID出现不止一次(由于他们有不同的入院/出院率)。
对于我的生活,我无法看到这是不正确的设计,除了使用count(tblPatientVisits.PatientID=1
然后union
与count(tblPatientVisits.patientid)>1
进行一次查询之外,我也不知道如何纠正它。
对此类设计有任何了解,或者我如何更优雅地找到一种方法从tblClaims
获取claimType,以便将声明ID与PatientID相关联,从而获得正确的行数?
编辑:我遇到的最大问题是,如果我在tblPatient表中包含admissionDate,dischargeDate
或patientState
,我就不能将patientID用作主键。
应注意tblClaims
NOT
必须tblPatientVisits.admissionDate, tblPatientVisits.dischargeDate
与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
相关。
编辑:示例查询以显示添加tblPatientVisits时,返回的行数多于声明数
SELECT tblClaims.id, tblPatient.patientID
FROM tblClaims INNER JOIN
tblPatientClaims ON tblClaims.id = tblPatientClaims.id INNER JOIN
tblPatient ON tblPatientClaims.patientid = tblPatient.patientID
返回了超过一百万个查询行
{{1}}
返回的查询行少于一百万
答案 0 :(得分: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
(或您使用的任何模式)前缀。
答案 1 :(得分:0)
我不确定我是否理解索赔的概念,但我怀疑您想要删除索赔与患者之间的链接表,而是将患者访问与索赔之间的关联联系起来。
这对你有用吗?