想知道为什么我的查询在输出中每个实体显示多个条目。据我所知,每个实体只有一个活动策略。
使用SQL Server Management Studio创建了查询,为了正确显示,我的输出中包含参数,我已经尝试了以下查询。
目前,我的SQL SSMS查询输出显示以下内容:
Entity_Number Building_Name PolicyID Description Start_Date End_Date
400 Xpress 4 5 Day Grace 7/1/2019 9/27/2019
400 Xpress 18 2 Day Grace 7/3/2018 7/13/2018
400 Xpress 19 4 Day Grace 2/27/2019 2/27/2019
我真正想知道的是,如何深入研究并找出为什么我的查询返回倍数?
【查询】
SELECT
e.Entity_Number,
bld.Building_Name,
cbp.PolicyId,
cbp.Description,
cbp.StartDate,
cbp.EndDate
FROM
dbo.buildings AS bld
INNER JOIN dbo.entities AS e
ON bld.Entity_ID = e.Entity_ID
INNER JOIN Collections.Building AS cbp
ON bld.Building_ID = cb.BuildingId
INNER JOIN Collections.BuildingProfile AS cbpro
ON cbp.BuildingPolicyId = cbpro.BuildingPolicyId
WHERE
bld.Building_Active = 1
AND e.Active = 1
使用;萨拉米技术";以隔离意外行的来源。我的意思是,通过逐个省略每个联接(以及与该联接相关的任何列引用(,可以像salami一样减少查询。
例如,从屏蔽加入Collections.BuildingProfile
:开始
SELECT
e.Entity_Number
, bld.Building_Name
, cbp.PolicyId
, cbp.Description
, cbp.StartDate
, cbp.EndDate
FROM dbo.buildings AS bld
INNER JOIN dbo.entities AS e ON bld.Entity_ID = e.Entity_ID
INNER JOIN Collections.Building AS cbp ON bld.Building_ID = cbp.BuildingId
-- INNER JOIN Collections.BuildingProfile AS cbpro ON cbp.BuildingPolicyId = cbpro.BuildingPolicyId
WHERE bld.Building_Active = 1
AND e.Active = 1
这是否删除了意外的列?如果没有,请尝试:
SELECT
e.Entity_Number
, bld.Building_Name
--, cbp.PolicyId
--, cbp.Description
--, cbp.StartDate
--, cbp.EndDate
FROM dbo.buildings AS bld
INNER JOIN dbo.entities AS e ON bld.Entity_ID = e.Entity_ID
--INNER JOIN Collections.Building AS cbp ON bld.Building_ID = cbp.BuildingId
--INNER JOIN Collections.BuildingProfile AS cbpro ON cbp.BuildingPolicyId = cbpro.BuildingPolicyId
WHERE bld.Building_Active = 1
AND e.Active = 1
最终,通过屏蔽每个联接(以及对该表的任何相关列引用(,您将发现哪个表正在生成意外的行相乘。
一旦确定了该表,我建议您重新考虑您对如何连接该表所做的所有假设。例如,您声明"据我所知,每个实体只有一个活动策略">这真的是真的吗
一旦您知道问题从哪里开始,并重新考虑如何在查询中实际使用这些数据,就应该更接近于解决方案。例如,也许您在联接中需要更多的条件,或者您需要联接一个子查询,而不是直接联接到表。
注:
查询似乎不需要Collections.BuildingProfile,为什么不省略它呢不管怎样