0

ストアド プロシージャを作成しました。

要件は次のとおりです。

  • 最初の照合は、会社名と個人名で行われます。
  • 一致が見つからない場合は、住所、市区町村、および個人名で 2 回目の一致を行う必要があります。
  • 一致するものが見つからない場合は、zip と個人名で 3 回目の一致を行う必要があります。

私が書いたのは

exec('insert into ProcessedFile_'+@fileuplodedId +' ('+@ConcatAppendedField+ ',UploadedB2bFiled_id) select '+@concatAppendFieldForSelect +',B2bFiled_id from UploadedFile_'+@fileuplodedId+' 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_'+@fileuplodedId +' ('+@ConcatAppendedField+ ',UploadedB2bFiled_id) select '+@concatAppendFieldForSelect +',B2bFiled_id from UploadedFile_'+@fileuplodedId+' 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_'+@fileuplodedId +' ('+@ConcatAppendedField+ ',UploadedB2bFiled_id) select '+@concatAppendFieldForSelect +',B2bFiled_id from UploadedFile_'+@fileuplodedId+' 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 番目のステートメントでそれらのフィールド (会社名と個人) を再度比較しています。名前)。

これを取り除く方法は?

4

1 に答える 1

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

a.CompanyDomain IS NULL の場合、NULL は何にも等しいわけではなく、NULL でさえ等しくないため、b.Domain と等しくなることはありません。

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

補遺

さて、私が理解しているように、最初のクエリが結果を返した場合に実行を中止したくない場合は、最初のクエリによって挿入されたものを 2 番目から除外し、1 番目と 2 番目によって挿入されたものを 3 番目から除外したいだけなので、重複が挿入されないようにしますか? その場合は、すべての基準を 1 つのクエリに結合することで、これを回避できると思います。

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

これが必要でない場合は、最初のクエリで挿入されたデータを 2 番目に使用し、1 番目と 2 番目に挿入されたデータを 3 番目に使用しているように聞こえるため、3 つの挿入の元のソリューションを使用する必要があると思います。

于 2012-04-05T08:25:14.427 に答える