为什么在查询输出中每个实体有多个条目?
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 子句中的“逗号优先”有助于简化“香肠技术”的使用
想知道为什么我的查询在输出中为每个实体显示多个条目。 据我了解,每个实体只有一项有效政策。
使用 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 子句中的“逗号优先”有助于简化“香肠技术”的使用