2012-04-05 78 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