【问题标题】:How can I find the remaining rows in the SQL query如何在 SQL 查询中找到剩余的行
【发布时间】:2017-08-01 00:42:45
【问题描述】:

我使用ODS.dbo.Account_Address__cPAF.dbo.Delivery_Addresses两个数据源(表)对表ODS.dbo.Account_Address__c中的地址数据进行统计汇总。表PAF.dbo.Delivery_Addresses 用于查找和内部连接。

所有感兴趣的数据是自CreatedDate=2016-09-28 之后的所有行,以及2016-09-28 之前的IsCurrent=1 的所有行。

表 1

SELECT DPID__c,CreatedDate
FROM ODS.dbo.Account_Address__c
WHERE CreatedDate>='2016-09-28'

UNION ALL

SELECT DPID__c,CreatedDate
FROM ODS.dbo.Account_Address__c
WHERE CreatedDate<'2016-09-28' AND IsCurrent=1 

总共有265773 rows

然后我通过内连接对数据进行子集化,返回 PAF.dbo.Delivery_Addresses,241565 rows

表 2

SELECT 
     aa.DPID__c, aa.CreatedDate     
FROM 
     ODS.dbo.Account_Address__c aa ,PAF.dbo.Delivery_Addresses da
WHERE
     aa.DPID__c = CONVERT(VARCHAR,da.DELIVERY_POINT_ID)
     AND aa.CreatedDate>='2016-09-28'
     AND aa.DPID__c IS NOT NULL

UNION ALL

SELECT
     aa.DPID__c,aa.CreatedDate
FROM    
     ODS.dbo.Account_Address__c aa ,PAF.dbo.Delivery_Addresses da
WHERE
     aa.DPID__c = CONVERT(VARCHAR,da.DELIVERY_POINT_ID)
     AND aa.CreatedDate<'2016-09-28'
     AND aa.DPID__c IS NOT NULL
     AND aa.IsCurrent=1

随后我还检查了另外两个子集。

表 3

DPID__c11170 rows 为空:

SELECT DPID__c,CreatedDate
FROM ODS.dbo.Account_Address__c
WHERE CreatedDate>='2016-09-28' AND DPID__c IS NULL 

UNION ALL

SELECT DPID__c,CreatedDate
FROM ODS.dbo.Account_Address__c
WHERE CreatedDate<'2016-09-28' AND IsCurrent=1 AND DPID__c IS NULL 

并拒绝内部连接集,12982 rows 返回。

表 4

SELECT a.DPID__c,a.CreatedDate
FROM
(
 SELECT DPID__c,CreatedDate
 FROM ODS.dbo.Account_Address__c
 WHERE CreatedDate>='2016-09-28' AND DPID__c IS NOT NULL

 UNION ALL

 SELECT DPID__c,CreatedDate
 FROM ODS.dbo.Account_Address__c
 WHERE CreatedDate<'2016-09-28' AND DPID__c IS NOT NULL AND IsCurrent=1
) a

EXCEPT

SELECT t.DPID__c,t.CreatedDate
FROM
(
 SELECT 
    aa.DPID__c, aa.CreatedDate      
 FROM   
    ODS.dbo.Account_Address__c aa ,PAF.dbo.Delivery_Addresses da
 WHERE
    aa.DPID__c = CONVERT(VARCHAR,da.DELIVERY_POINT_ID)
    AND aa.CreatedDate>='2016-09-28'
    AND aa.DPID__c IS NOT NULL

 UNION ALL

 SELECT
   aa.DPID__c, aa.CreatedDate           
 FROM   
   ODS.dbo.Account_Address__c aa ,PAF.dbo.Delivery_Addresses da
 WHERE
   aa.DPID__c = CONVERT(VARCHAR,da.DELIVERY_POINT_ID)
   AND aa.CreatedDate<'2016-09-28'
   AND aa.DPID__c IS NOT NULL
   AND aa.IsCurrent=1
 ) t

经验证,Count_Row(Table 1)&gt;Count_Row(Table 2)+Count_Row(Table 3)+Count_Row(Table 4)56Table 1 中仍然有额外的行,但在任何其他表中都没有。

任何人都可以帮助建议这种差距是如何发生的以及我如何检测剩余的56 rows

干杯

【问题讨论】:

  • UNION ALL 表 2、3 和 4 和 EXCEPT 表 1 的结果。如果您没有返回任何内容,则这意味着这 56 行与 Table2 和/或 3 和/或 4 中的某些行完全相同。
  • @Alex 感谢您的好建议。

标签: sql sql-server inner-join


【解决方案1】:

您的 except 删除重复项。你应该使用except all。 不幸的是,SQL 服务器没有except all,但这可能是你的行被丢弃的地方。

检查每个查询中的唯一行,您应该有相同的编号。

【讨论】:

  • 谢谢史蒂文。重复删除是问题所在。
猜你喜欢
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2021-10-26
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多