为什么在查询输出中每个实体有多个条目

  • 本文关键字:实体 查询 输出 sql ssms
  • 更新时间 :
  • 英文 :


想知道为什么我的查询在输出中每个实体显示多个条目。据我所知,每个实体只有一个活动策略。

使用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,为什么不省略它呢不管怎样
  • 重新格式化为";逗号优先";在select子句中有助于简化";萨拉米技术">
  • 最新更新