2017-08-01 4 views
1

2つのデータソース(テーブル)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_Addresses241565 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 

その後、私は他の2つのサブセットを確認してください。

表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'です。何も返されていない場合は、これらの56行がTable2および/または3および/または4の行の一部と完全に重複していることを意味します。 – Alex

+0

@Alexは良いアドバイスをいただきありがとうございます。 – LUSAQX

答えて

1

あなたexceptは、重複を削除します。 except allを使用してください。 残念ながら、SQLサーバーにはexcept allがありませんが、おそらくその行が削除されている場所です。

各クエリの一意の行を確認するには、同じ番号が必要です。

+0

ありがとうSteven。重複削除が問題でした。 – LUSAQX

関連する問題