【发布时间】:2017-08-01 00:42:45
【问题描述】:
我使用ODS.dbo.Account_Address__c和PAF.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__c 的 11170 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)>Count_Row(Table 2)+Count_Row(Table 3)+Count_Row(Table 4) 和 56 在 Table 1 中仍然有额外的行,但在任何其他表中都没有。
任何人都可以帮助建议这种差距是如何发生的以及我如何检测剩余的56 rows?
干杯
【问题讨论】:
-
UNION ALL表 2、3 和 4 和EXCEPT表 1 的结果。如果您没有返回任何内容,则这意味着这 56 行与 Table2 和/或 3 和/或 4 中的某些行完全相同。 -
@Alex 感谢您的好建议。
标签: sql sql-server inner-join