2012-04-05 8 views
0

ストアドプロシージャを作成しました。SQLストアドプロシージャの比較回数を減らす

  • 最初の一致が会社名や人物名で行われます。以下の

    が要件です。

  • 一致するものが見つからない場合は、住所、都市名、人名で2番目の一致を行う必要があります。
  • 一致するものが見つからない場合、3番目の一致は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)` 

ましたが、(最初のものを除く)それぞれの文で私は会社名を比較して、私が最初のように前に行ったすべてのフィールドを比較しています、とこれは絶対に非効率的です2番目のステートメントでは、これらのフィールド(会社名と人名)を再度比較しています。

これを取り除くにはどうすればよいですか?

+0

あなたが仕事を強いられなかった場合、あなたの質問を読んで(おそらく)助けてくれればもっと回答を得るでしょう。例えば。あなたの文章の始めを大文字にし、読みやすいようにSQLクエリをフォーマットしてください。 –

+1

@AlexInParis申し訳ありません –

答えて

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もNULLと等しくないもの、a.CompanyDomainがNULLであれば、それは決してでき等しいb.Domainので、これは

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

ADENDUM

に簡略化することができないので、

さて、最初のクエリが結果を返す場合は、実行を中止する必要はなく、1番目のクエリで挿入されたものと2番目のクエリで挿入されたものを除外したいだけです。 3rd so重複が挿入されないようにしますか?これは私があなたのように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 

:その場合は、私はあなたが1つのクエリにすべての条件を組み合わせることにより、これを回避することができると思います2番目のクエリで挿入されたデータと1番目と2番目に挿入されたデータを使用しているようです。

+0

会社名と住所、市名、人名の両方に一致するものがある場合は、出力表の会社名と住所、都市名、人名の2つが更新されます。詳細は会社名にマッチします。アドレス、市、人名を再度一致させる必要はありません。 –

+0

申し訳ありませんが、 '@@ ROWCOUNT = 0'を' @@ ROWCOUNT> 0 'に変更しました。会社名と会社名の最初のクエリに一致するものがある場合、2番目のクエリは実行されません。 2番目のクエリに一致するものがある場合、3番目のクエリは実行されません。 – GarethD

+0

私たちは、いくつかのcomapnyドメイン、アドレス、都市名、人名があるテーブルを想像してみてください。上で実行すると、まず一致するドメインがいくつかあります。その後、更新の終了後にアドレス、名。私はあなたにたくさんの気持ちを抱いています@ガレスですか? –

関連する問題