2017-08-01 62 views
1

我用兩個數據源(表)ODS.dbo.Account_Address__cPAF.dbo.Delivery_Addresses做出關於地址的數據統計彙總表ODS.dbo.Account_Address__c。表PAF.dbo.Delivery_Addresses用於查找和內部連接。如何找到在SQL查詢剩餘行

所有感興趣的數據都是自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

NULL 11170 rowsDPID__c

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)仍然有Table 1但不是在任何其他表56額外行。

任何人都可以幫助建議如何發生這種差距,我怎麼能檢測到其餘56 rows

乾杯

+0

'UNION ALL'表2,3和4以及'EXCEPT'表1的結果。如果沒有任何返回值,則意味着這56行是表2和/或3和/或4中某些行的精確重複。 – Alex

+0

@Alex感謝您的好建議。 – LUSAQX

回答

1

except刪除重複。你應該使用except all。 不幸的是,SQL服務器沒有except all,但那可能是你的線路被丟棄的地方。

檢查每個查詢中的唯一行,你應該有相同的數字。

+0

謝謝史蒂文。重複的刪除是問題。 – LUSAQX