0

次の SQL クエリを使用して、2 つの Excel ワークシートを比較しています (両方のセットの違い)

strSql = "SELECT [CD_CLIENTE], [NM_CLIENTE], [CPF/CNPJ], [DS_DOCUMENTO], [DTVALIDADE] FROM [BaseAnterior$] " & _
         "WHERE NOT EXISTS  ( " & _
            "SELECT * FROM [BaseAtual$] WHERE" & _
                "[BaseAtual$].[CD_CLIENTE] = [BaseAnterior$].[CD_CLIENTE] AND " & _
                "[BaseAtual$].[NM_CLIENTE] = [BaseAnterior$].[NM_CLIENTE] AND " & _
                "[BaseAtual$].[DS_DOCUMENTO] = [BaseAnterior$].[DS_DOCUMENTO] AND " & _
                "[BaseAtual$].[CPF/CNPJ] = [BaseAnterior$].[CPF/CNPJ] AND " & _
                "[BaseAtual$].[DTVALIDADE] = [BaseAnterior$].[DTVALIDADE]" & _
            ")"

ステートメントは正常に機能しますが、問題は非常に遅いことです。ワークシートには約があります。100,000 件のレコード (深刻なデータベースにない理由を聞かないでください) で、実行には数分かかる場合があります。問題が SQL ステートメントにあることはわかっているので、質問は次のとおりです。SQL で差集合を選択するより速い方法はありますか?

4

2 に答える 2

1

最初に両方のシートをすべての列で並べ替えてから、これを試してください。

strSql = "SELECT " &_
      "[B1].[CD_CLIENTE], [B1].[NM_CLIENTE], [B1].[CPF/CNPJ], [B1].[DS_DOCUMENTO], [B1].[DTVALIDADE], " &_
      "[B2].[CD_CLIENTE], [B2].[NM_CLIENTE], [B2].[CPF/CNPJ], [B2].[DS_DOCUMENTO], [B2].[DTVALIDADE] " &_
    [FROM BaseAnterior$] [B1] " & _
         "FULL JOIN [BaseAtual$] [B2] " & _
                "ON [B2].[CD_CLIENTE] = [B1].[CD_CLIENTE] AND " & _
                "[B2].[NM_CLIENTE] = [B1].[NM_CLIENTE] AND " & _
                "[B2].[DS_DOCUMENTO] = [B1].[DS_DOCUMENTO] AND " & _
                "[B2].[CPF/CNPJ] = [B1].[CPF/CNPJ] AND " & _
                "[B2].[DTVALIDADE] = [B1].[DTVALIDADE]"
于 2013-01-08T13:24:05.453 に答える
0

おそらく最速の方法は、SQLをまったく使用しないことです。以下をせよ:

  1. 2枚のシートのレコードを列のリストで並べ替えます
  2. リストを下に移動し、レコードをレコードと比較します

Excelは、レコードの並べ替えに非常に適しています。その場合、比較は非常に高速になります。

元の定式化では、1つのシートの各レコードを、他のすべてのレコード(おそらく半分)と比較する必要があります。これには長い時間がかかります。

于 2013-01-08T14:14:37.833 に答える