2012-02-23 21 views
0

考慮下面的SQL查詢一種更好的方式來處理下面的SQL查詢過濾條件

INSERT INTO [dbo].[PartnerCommissionData] 
SELECT X.* 
FROM 
(
     SELECT 
       cs.partner_id 
       ,cs.quarter 
       ,cs.year 
       ,cs.partner_currency_amount 
       ,p.partner_email       
       ,cs.report_status_id  
       ,Creation_dt = GETDATE()  
     FROM [dbo].[CommissionSummary] cs WITH(NOLOCK) 
     INNER JOIN [dbo].[Partner] p WITH(NOLOCK) ON p.partner_id = cs.partner_id 
     WHERE 
       cs.year = YEAR(@FirstDayOfQuarter) 
     AND  cs.quarter = @Quarter 
     AND  cs.report_status_id IN (1,2) 
    )X 
WHERE 
    X.partner_id NOT IN (SELECT [Partner_Id] FROM [dbo].[PartnerCommissionData] WITH (NOLOCK)) 
AND X.quarter NOT IN (SELECT [Quarter] FROM [dbo].[PartnerCommissionData] WITH (NOLOCK)) 
AND X.year NOT IN (SELECT [Year] FROM [dbo].[PartnerCommissionData] WITH (NOLOCK)) 
AND X.report_status_id NOT IN (SELECT [CommissionStatus_id] FROM [dbo].[PartnerCommissionData] WITH (NOLOCK)) 

指定過濾條件表明,如果已經存在於PartnerCommissionData表中的記錄,那麼它不應該被進一步插入。但按照我的看法,這是一種惡劣的實施。

WHERE 
    X.partner_id NOT IN (SELECT [Partner_Id] FROM [dbo].[PartnerCommissionData] WITH (NOLOCK)) 
AND X.quarter NOT IN (SELECT [Quarter] FROM [dbo].[PartnerCommissionData] WITH (NOLOCK)) 
AND X.year NOT IN (SELECT [Year] FROM [dbo].[PartnerCommissionData] WITH (NOLOCK)) 
AND X.report_status_id NOT IN (SELECT [CommissionStatus_id] FROM [dbo].[PartnerCommissionData] WITH (NOLOCK)) 

我們怎樣才能以更好的方式改寫它?

我們可以應用合併或任何其他方式....?

預先感謝

+1

但是你'NOLOCK',這不就是神奇的渦輪增壓按鈕? – 2012-02-23 03:12:40

回答

1

你能做這樣的事嗎?不需要離開連接(掃描另一張桌子)。 承擔PARTNER_ID,季,年,report_status_id需要轉換爲nvarchar

INSERT INTO [dbo].[PartnerCommissionData] 
    SELECT X.* 
    FROM 
    (
      SELECT 
        cs.partner_id 
        ,cs.quarter 
        ,cs.year 
        ,cs.partner_currency_amount 
        ,p.partner_email       
        ,cs.report_status_id  
        ,Creation_dt = GETDATE()  
      FROM [dbo].[CommissionSummary] cs WITH(NOLOCK) 
      INNER JOIN [dbo].[Partner] p WITH(NOLOCK) ON p.partner_id = cs.partner_id 
      WHERE 
        cs.year = YEAR(@FirstDayOfQuarter) 
      AND  cs.quarter = @Quarter 
      AND  cs.report_status_id IN (1,2) 
     )X 
    WHERE 
    (x.partner_id + x.quarter + x.year + x.report_status_id) <> 
    (partner_id + x.quarter + x.year + x.report_status_id) 
+0

我不會太信任'CHECKSUM '。有許多記錄的情況下,它可以爲非常相似(但不相同)的行生成相同的值... – 2012-02-23 03:30:41

+0

同意,刪除'CHEKSUM'並更新答案。 – Turbot 2012-02-23 03:42:56

+0

這也出現在我的腦海中...但是他們是整數 – user1025901 2012-02-23 03:52:39

0

執行連接,而不是內選擇。這是非常混亂的SQL。考慮一套而不是程序。

0

所以,如果我的理解是正確的,你避免將可能有重複的數據,我改變了你的SQL的東西如下:

INSERT INTO [dbo].[PartnerCommissionData] 
SELECT X.* 
FROM 
(
     SELECT 
       cs.partner_id 
       ,cs.quarter 
       ,cs.year 
       ,cs.partner_currency_amount 
       ,p.partner_email       
       ,cs.report_status_id  
       ,Creation_dt = GETDATE()  
     FROM [dbo].[CommissionSummary] cs WITH(NOLOCK) 
     INNER JOIN [dbo].[Partner] p WITH(NOLOCK) ON p.partner_id = cs.partner_id 
     WHERE 
       cs.year = YEAR(@FirstDayOfQuarter) 
     AND  cs.quarter = @Quarter 
     AND  cs.report_status_id IN (1,2) 
    )X 
    LEFT JOIN [PartnerCommissionData] PCD WITH (NOLOCK)) 
      ON X.partner_id = PCD.[Partner_Id] OR X.quarter = PCD.[Quarter] 
       OR X.year = PCD.[Year] OR X.report_status_id = PCD.[CommissionStatus_id] 
WHERE PCD.ID IS NULL 

我想在這裏做的事情是第一個LEFT JOIN該表並嘗試抓取任何數據(如果它們存在),然後使用IS NULL檢查來過濾掉任何現有數據,以便我們不需要NOT IN,其性能不佳並且不被推薦。

+0

感謝Craig'Editing!:) – 2012-02-23 03:30:41

+0

什麼是PCD.ID ..應該是PCD。[Partner_Id]? – user1025901 2012-02-23 03:56:27

+0

它應該是表格上的PK,對不起,我不知道Partner_Id是否是一個,所以我把ID放在那裏,它應該是一個從不包含NULL的列 – 2012-02-23 03:57:38

相關問題