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

Why do I have multiple entries per entity in the query output?

想知道为什么我的查询在输出中为每个实体显示多个条目。 据我了解,每个实体只有一项有效政策。

使用 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

我真正想知道的是如何向下钻取并找出为什么我的查询 returns 倍数?

[查询]

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

使用“香肠技术”隔离意外行的来源。我的意思是,您通过一个一个地省略每个连接(以及与该连接相关的任何列引用)来像意大利腊肠一样减少查询。

例如从屏蔽 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

最终,通过屏蔽每个连接(以及对该 table 的任何相关列引用),您将发现哪个 table 产生了意想不到的行数。

一旦 table 被确定,我建议您重新考虑所有假设 您对 table 是如何加入的。例如,您声明 “据我了解,每个实体只有一个有效策略。” 这是真的吗?

一旦您知道问题的根源,并重新考虑在查询中实际应如何使用该数据,您应该更接近解决方案。例如也许你需要更多的条件加入,或者你需要加入一个子查询而不是直接加入table.

注:

  • Collections.BuildingProfile好像查询不需要,为什么不省略呢 无论如何?
  • 重新格式化 select 子句中的“逗号优先”有助于简化“香肠技术”的使用