2012-02-23 65 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

相关问题