2012-04-05 77 views
0

我创建了一个存储过程。减少SQL存储过程中的比较次数

以下是要求:

  • 首场比赛是在公司名称和人名做。
  • 如果找不到匹配,则应在地址,城市和人名中进行第二次匹配。
  • 如果找不到匹配,则应在zip和个人名称上进行第三次匹配。

我写的是什么

exec('insert into ProcessedFile_'[email protected] +' ('[email protected]+ ',UploadedB2bFiled_id) select '[email protected] +',B2bFiled_id from UploadedFile_'[email protected]+' a , b2bdb b where ((a.CompanyDomain = b.domain and ISNULL(a.CompanyDomain,'''') <> '''' and a.CompanyDomain is not null and a.Name=b.Name)) group by B2bFiled_id,' + @concatAppendFieldForGroupBy) 

exec('insert into ProcessedFile_'[email protected] +' ('[email protected]+ ',UploadedB2bFiled_id) select '[email protected] +',B2bFiled_id from UploadedFile_'[email protected]+' a , b2bdb b where (((a.CompanyDomain is null or a.CompanyDomain !=b.domain) and a.Address1 = b.address and a.City = b.city and a.Name = b.Name)) group by B2bFiled_id,' + @concatAppendFieldForGroupBy) 

exec('insert into ProcessedFile_'[email protected] +' ('[email protected]+ ',UploadedB2bFiled_id) select '[email protected] +',B2bFiled_id from UploadedFile_'[email protected]+' a , b2bdb b where ((((a.CompanyDomain is null or a.CompanyDomain !=b.domain) and (a.Address1 = b.address and a.City = b.city and a.Name = b.Name)) and a.Zip = b.Zip and a.Name = b.Name)) group by B2bFiled_id,' + @concatAppendFieldForGroupBy)` 

但是,这是绝对的低效率,在每个语句(除了第一个),我比较所有的字段我在之前做了第一个我比较公司名称和人名和第二个陈述我再次比较这些领域(公司名称和人名)。

如何摆脱这个?

+0

如果您不强迫我们工作,只是为了能够阅读您的问题并(可能)帮助您,您会得到更多回复。例如。在句子的开头大写,并格式化SQL查询以便读取。 – 2012-04-05 07:42:53

+1

@AlexInParis对不起 – 2012-04-05 07:46:10

回答

2

如果插入行,您可以在每次插入后添加一条RETURN语句以退出批处理。这样您就不必从以前的查询中删除标准。例如

DECLARE @QueryStart NVARCHAR(1000), @QueryEnd NVARCHAR(1000) 
SET @QueryStart = ' INSERT INTO ProcessedFile_' + @FileUploadID + 
       ' (' + @ConcatAppendField + ', UploadedB2bFiled_ID) ' + 
       ' SELECT ' + @ConcatAppendFieldForSelect + ', B2bFiled_ID ' + 
       ' FROM UploadFile_' + @FileUploadedID + ' a, B2bDB b ' 

SET @QueryEnd = ' GROUP BY B2bFiled_ID, ' + @ConcatAppendFieldForGroupBy  

DECLARE @Query NVARCHAR(1000) 
SET @Query = @QueryStart + 
      ' WHERE a.CompanyDomain = b.Domain ' + 
      ' AND ISNULL(a.CompanyDomain, '''') != '''' ' + 
      ' AND a.CompanyDomain IS NOT NULL ' + 
      ' AND a.Name = b.Name ' + 
      @QueryEnd 

EXECUTE SP_EXECUTESQL @Query 

IF (@@ROWCOUNT > 0) 
    RETURN 

SET @Query = @QueryStart + 
      ' WHERE a.Address1 = b.Address ' + 
      ' AND a.City = b.City ' + 
      ' AND a.Name = b.Name ' + 
      @QueryEnd 

EXECUTE SP_EXECUTESQL @Query 

IF (@@ROWCOUNT > 0) 
    RETURN 

SET @Query = @QueryStart + 
      ' WHERE a.Zip = b.Zip ' + 
      ' AND a.Name = b.Name ' + 
      @QueryEnd 

EXECUTE SP_EXECUTESQL @Query 

我已经复制了你的子句,但值得指出的是下面的where子句可以简化。

WHERE a.CompanyDomain = b.Domain 
AND ISNULL(a.CompanyDomain, '') != '' 
AND a.CompanyDomain IS NOT NULL 

由于NULL不等于任何东西,甚至不为空,如果a.CompanyDomain为null,则它决不可能等于b.Domain,所以这可以简化为

WHERE NULLIF(a.CompanyDomain, '') = b.Domain 

ADENDUM

好吧,据我现在了解,如果第一个查询返回结果,您不想中止执行,您只想排除第一个查询插入的任何内容,以及第一个和第二个查询插入的内容3日如此你避免重复插入?如果是这样的话,我认为你能解决这个问题,通过组合的标准到一个查询:

DECLARE @Query NVARCHAR(1000) 
SET @Query = ' INSERT INTO ProcessedFile_' + @FileUploadID + 
      ' (' + @ConcatAppendField + ', UploadedB2bFiled_ID) 
      SELECT ' + @ConcatAppendFieldForSelect + ', B2bFiled_ID 
      FROM UploadFile_' + @FileUploadedID + ' a 
        INNER JOIN B2bDB b 
         ON a.Name = b.Name 
      WHERE NULLIF(a.CompanyDomain, '''') = b.Domain 
      OR  (a.Address1 = b.Address AND a.City = b.City) 
      OR  a.Zip = b.Zip 
      GROUP BY B2bFiled_ID, ' + @ConcatAppendFieldForGroupBy 

EXECUTE SP_EXECUTESQL @QUERY 

如果这不是需要什么我想你可能必须使用你原来的3个刀片解决方案这听起来像是你正在使用第一个查询插入的数据,第二个数据插入第一个和第二个。

+0

如果我们有一个匹配的公司名称和地址,城市,人名两个,那么他们将在输出表中的两个更新公司名称和其他地址,城市,人名name.What我想要的是如果细节匹配的公司名称然后他们是不需要匹配的地址,城市,人名again.Awaysways很多谢谢@GarethD。 – 2012-04-05 08:49:04

+0

对不起,已将'@@ ROWCOUNT = 0'更改为'@@ ROWCOUNT> 0'。如果公司名称和名称的第一个查询中存在匹配项,则不会执行第二个查询。如果第二个查询匹配,则第三个查询将不会执行。 – GarethD 2012-04-05 08:57:06

+0

想象一下,我们有一张表,其中包含一些公司域名,地址,城市和人名。在上面执行的过程中,首先我们有一些域匹配ok,然后在更新执行结束后,我们将跳过匹配地址,城市,名称。我很困扰你@GarethD? – 2012-04-05 09:17:23