2016-03-04 59 views
1

我有兩個共享公用密鑰和幾個不同列的表。常見的關鍵是CampaignID。其中一張桌子比另一張桌子稍微多一點CampaignID,我想知道這兩張桌子之間的區別。目前,我使用LEFT OUTER JOINCTE先合併這兩個表格,然後通過檢查CTE結果集中NULL列中的上一步導出的結果集來計算CampaignID列中的差異。例如,基於公共密鑰(Microsoft SQL Server)查找兩個表之間的差異

WITH CTE_Results 
    AS (SELECT t1.CampaignID AS cd_CampaignID, 
       t2.CampaignID AS cod_CampaignID, 
       t1.NAME, 
       t2.Vendor 
     FROM CampaignDetails AS t1 
       LEFT OUTER JOIN CampaignOnlineDetails AS t2 
          ON t1.CampaignID = t2.CampaignID) 

-- Now that I have CTE result, I'll use another SELECT to find the difference 
SELECT cd_CampaignID, cod_CampaignID 
FROM CTE_Results 
WHERE cod_CampaignID is NULL 

但這對我來說似乎效率低下。是否有更高效/更快速的方式來比較Microsoft SQL Server中兩個表之間特定列的差異?謝謝您的回答!

注意:我是一般的Microsoft SQL Server和SQL新手。

+1

此處不需要cte,但不會影響性能。您可以將where子句「where t.cod_CampaingID IS NULL」添加到主查詢中。但這與執行計劃不會有任何不同。如果你只想要兩個campaignID列,你應該從你的內部查詢中排除它們。 –

回答

2

如果一個表具有比其他更多的則是如何回合:

SELECT C1.* FROM CAMPAIGN_WITH_MORE_DATA AS C1 
WHERE NOT EXISTS(SELECT * FROM CAMPAIGN_WITH_LESS_DATA AS C2 
           WHERE C2.CAMPAIGN_ID = C1.CAMPAIGN_ID) 

如果其中可能有一個廣告活動或不那麼UNION這樣的:

SELECT C1.Name AS [Col1], 
    C1.CAMPAIGN_ID, 
    'More Campaigns' AS [Source] 
FROM CAMPAIGN_WITH_MORE_DATA AS C1 
WHERE NOT EXISTS(SELECT * FROM CAMPAIGN_WITH_LESS_DATA AS C2 
       WHERE C2.CAMPAIGN_ID = C1.CAMPAIGN_ID) 
UNION ALL 
SELECT C2.Vendor AS [Col1], 
    C2.CAMPAIGN_ID, 
    'Less Campaigns' AS [Source] 
FROM CAMPAIGN_WITH_LESS_DATA AS C2 
WHERE NOT EXISTS(SELECT * FROM CAMPAIGN_WITH_MORE_DATA AS C1 
       WHERE C1.CAMPAIGN_ID = C2.CAMPAIGN_ID) 
+0

謝謝!這是一個很好的工作解決方案。 :) – user1330974

1

不存在可能比一個更有效率左加入。這也會工作:

SELECT CampaignID FROM CampaignDetails 
EXCEPT 
SELECT CampaignID FROM CampaignOnlineDetails 

只是相反的順序來檢查其他方式。

+0

你建議的解決方案也可以,但我接受了McKeown的答案,因爲他提交的第一個,他的工作。謝謝。 :) – user1330974