【VBA】ADODBのSQLで重複削除が上手くいかなかったとき

ADODBを使って
エクセルデータをSQL操作する際
重複削除がうまくできなかったので
備忘録として残しておきます!

ADODBで失敗した重複削除のSQL文

コネクション条件

ThisWorkBookにコネクション。

Set cn = New ADODB.Connection
Prov16_AC2016 = "Provider = Microsoft.ACE.OLEDB.16.0;Data Source="
FN = ThisWorkbook.Path & "\" & ThisWorkbook.Name
Excel_xlsx = "Excel 12.0"
cn.ConnectionString = Prov16_AC2016 & FN & ";Extended Properties=""" & Excel_xlsx & ";HDR=Yes;"";"
cn.Open
マクロを回すとSheetに重複データが出て困る

と相談を受け、中身を見てみると
ADODBの
SELECT結果に重複データが混じっている
のが原因でした。

そこでSELECT文にデータを重複削除する
「DISTINCT」
を追記しようと考えました。

基本的なDISTINCT文

SELECT
DISTINCT col1, col2, col3
FROM
table

これで複数カラムで同じレコードは
重複削除されますね。

エラーが発生

基本的なDISTINCT文に沿って
SQLを書き直したのですが
何度やっても以下エラーが発生。。

エラー文
複数ステップのOLE DB操作でエラーが発生しました。

ADODBで成功した重複削除のSQL文

サブクエリでDISTINCT

SELECT
col1,
col2,
col3
FROM (
SELECT DISTINCT
col1,
col2,
col3
FROM
table
)

簡単に書くとこんな感じです!

サブクエリ内でDISTINCTして
その結果をSELECTすると
うまく動作しました。

Microsoft Access SQL と ANSI SQL

SQLの規格について

ADODBのプロバイダで指定した
Accessデータベースエンジンは
Microsoft Access SQL

一般的にDBで扱っているSQLは
ANSI SQL

Microsoft Access SQLは
ANSI SQLをほぼ準拠しているけど
100%ではないらしい。

その中に
「 DISTINCT 集計関数の参照 」
は Microsoft Access SQL で
サポートされていません。
とあった!

けど…

SELECT COUNT( DISTINCT col1 )…
がサポートされてないと言ってるので

SELECT DISTINCT col1 …
これはうまく処理できるのでは?…

まだ自分が気づいていない事がありそう・・。
もう少し調べてみようと思います。

参照:Microsoft Access SQL と ANSI SQL の比較

困っている人がいれば
ひとつの参考として試してみてください。