【问题标题】:How to identify why rows are duplicating如何确定行重复的原因
【发布时间】:2019-02-04 21:52:38
【问题描述】:

以下查询从主表中选择所有行(我检查过的表中没有重复项),并且此查询计算工作日数并根据特定天数对其进行检查,如果计数更大超过一定天数,就晚了,否则不晚。由于某种原因,当我运行此查询时,即使选择 DISTINCT,我的行也会重复。我看到每个跟踪号都有一行显示一个迟到,另一个显示未迟到,但我不明白他们怎么可能同时显示两个答案?谁能帮我理解为什么我的行被重复?

SELECT DISTINCT case UT.[Service] when '0PW' then 'UPS SurePost 1 lb or Greater' else UT.[Service] end as 'Service'
        ,US.[Region]
        ,UT.[Tracking_Number]  as 'TrackingCounts'
        ,UT.Manifest_Date
        ,UT.Date_Delivered
        ,Ship_To_Postal_Code
        ,WarehouseLocation
        ,CASE 
                    WHEN UT.[Service] = 'UPS Ground' AND WarehouseLocation = 'Wausau' then iif(((
                          DATEDIFF(dd, UT.[Manifest_Date], CASE WHEN (UT.[Date_Delivered] = '1/1/2099') THEN GETDATE() WHEN (UT.[Date_Delivered] IS NULL) THEN GETDATE() ELSE UT.[DATE_DELIVERED] END) )
                        -(DATEDIFF(wk, UT.[Manifest_Date], CASE WHEN (UT.[Date_Delivered] = '1/1/2099') THEN GETDATE() WHEN (UT.[Date_Delivered] IS NULL) THEN GETDATE() ELSE UT.[DATE_DELIVERED] END) * 2)
                        -(CASE WHEN DATENAME(dw, UT.[Manifest_Date]) = 'Sunday' THEN 1 ELSE 0 END)
                        -(CASE WHEN DATENAME(dw, UT.[Date_Delivered]) = 'Saturday' THEN 1 ELSE 0 END)
                        -(Select Count(*) from [Reporting_Operations].[CORP\u694172].[tbl_HolidayDates] where  [HolidayDate] between UT.[Manifest_Date] and UT.[Date_Delivered])) > UZ.TNTDAYS, 1, 0)
                    WHEN UT.[Service] in ('UPS SurePost 1 lb or Greater','UPS SurePost Less than 1 lb','0PW') AND WarehouseLocation = 'Wausau' then iif(((
                          DATEDIFF(dd, UT.[Manifest_Date], CASE WHEN (UT.[Date_Delivered] = '1/1/2099') THEN GETDATE() WHEN (UT.[Date_Delivered] IS NULL) THEN GETDATE() ELSE UT.[DATE_DELIVERED] END) )
                        -(DATEDIFF(wk, UT.[Manifest_Date], CASE WHEN (UT.[Date_Delivered] = '1/1/2099') THEN GETDATE() WHEN (UT.[Date_Delivered] IS NULL) THEN GETDATE() ELSE UT.[DATE_DELIVERED] END) * 2)
                        -(CASE WHEN DATENAME(dw, UT.[Manifest_Date]) = 'Sunday' THEN 1 ELSE 0 END)
                        -(CASE WHEN DATENAME(dw, UT.[Date_Delivered]) = 'Saturday' THEN 1 ELSE 0 END)
                        -(Select Count(*) from [Reporting_Operations].[CORP\u694172].[tbl_HolidayDates] where  [HolidayDate] between UT.[Manifest_Date] and UT.[Date_Delivered])) > (UZ.TNTDAYS + 1), 1, 0)
                    ELSE iif(((
                          DATEDIFF(dd, UT.[Manifest_Date], CASE WHEN (UT.[Date_Delivered] = '1/1/2099') THEN GETDATE() WHEN (UT.[Date_Delivered] IS NULL) THEN GETDATE() ELSE UT.[DATE_DELIVERED] END))
                        -(DATEDIFF(wk, UT.[Manifest_Date], CASE WHEN (UT.[Date_Delivered] = '1/1/2099') THEN GETDATE() WHEN (UT.[Date_Delivered] IS NULL) THEN GETDATE() ELSE UT.[DATE_DELIVERED] END) * 2)
                        -(CASE WHEN DATENAME(dw, UT.[Manifest_Date]) = 'Sunday' THEN 1 ELSE 0 END)
                        -(CASE WHEN DATENAME(dw, UT.[Date_Delivered]) = 'Saturday' THEN 1 ELSE 0 END)
                        -(Select Count(*) from [Reporting_Operations].[CORP\u694172].[tbl_HolidayDates] where  [HolidayDate] between UT.[Manifest_Date] and UT.[Date_Delivered])) > USS.[Days], 1, 0)   
            End as LATE
  FROM [Reporting_Operations].[CORP\u694172].[tbl_UPS_Automation_QVM_Tracking] UT
  INNER JOIN [Reporting_Operations].[CORP\u694172].[tbl_UPS_Automation_States] US on US.[State] = UT.[Ship_To_State_Province]
  INNER JOIN [Reporting_Operations].[CORP\u694172].[tbl_UPS_Automation_Ground_Zips] UZ on UZ.[DESTZIPCODE] = UT.[Ship_To_Postal_Code]
  INNER JOIN [Reporting_Operations].[CORP\u694172].[tbl_UPS_Automation_Services] USS on UT.[Service] = UT.[Service]
  where cast(UT.Manifest_Date as date) between '1/20/2019' and '1/26/2019' AND WarehouseLocation = 'Wausau' and UT.Status = 'Delivered'
  group by UT.[Service],US.[Region], USS.Days, UT.[Manifest_Date], UT.[Date_Delivered], TNTDAYS, Tracking_Number, Ship_To_Postal_Code, WarehouseLocation

所以我发现问题出在INNER JOIN [Reporting_Operations].[CORP\u694172].[tbl_UPS_Automation_Services] USS on UT.[Service] = UT.[Service]

但是我不明白为什么当我在USS.Service 上加入UT.SERVICE 时,uss.service 字段会显示所有可能的服务,而不是Ut.SERVICE 具有的值。

如果 UT.Service = UPS 2nd Day Air 加入 USS 不会只给我 UPS 2nd Day Air 价值吗?

【问题讨论】:

  • 如果您的任何联接导致多于一行,则会得到重复。
  • 我找到了问题所在的连接,感谢您指出这一点,但我还是有点困惑。
  • 如果您的表关系是 1:N,那么当您在这些表之间执行 INNER JOIN 时,您将获得 N 行,而不是 1 行。要回答您的问题,您从未从 JOIN 或 WHERE 中过滤 UT.Service,因此您不会只获得这些值,您只会从该 CASE 语句中获得 NULLS 或空数据。一个常见的解决方法是加入子查询,在其中选择 MAX 或使用 DISTINCT 以获得单行。
  • 在没有看到实际数据的情况下无法进一步帮助您。
  • 列数不代表关系类型。你有错字吗? INNER JOIN [Reporting_Operations].[CORP\u694172].[tbl_UPS_Automation_Services] USS on UT.[Service] = UT.[Service]

标签: sql-server tsql


【解决方案1】:

根本原因是其中一个连接返回多于 1 条记录 您需要找到问题根源的方法是:

1- 从您的选择中删除所有列以成为Select * from yourtable

2- 评论所有连接

3- 取消注释连接并查看您的数据以查看是否重复

3.1-如果记录不重复则加入是可以的,下次加入时也这样做

3.2-如果记录重复,意味着连接可能不正确,通常缺少一些连接条件

4- 修复加入问题后,删除 * 并恢复字段

5- 做最后检查

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多