フリーで公開されているCSVファイルをインポートしてテーブルを作成したのですが、そのCSVのファイルが追加されたり変更された時に一括で追加変更を実施しようと思い(データが2万件以上有る為一つ一つ確認するのは無理)作成し追加された場合の処理は不一致クエリを利用して問題なく出来たのですが変更された場所が有った場合の更新を不一致クエリにて行ったところ全ての件数を更新してしまうのでネットにて調べたところサンプルが有ったのでそれを元に下記の通りに記載したのですが、JOIN操作の構文エラーというエラーが出て前に進みません。
どこに問題があるのかサンプルと見比べたのですが一向に判りません。
誠に申し訳ございませんがご教授願います。
尚、サンプルとして見たのは下記のサイトです。
http://www.accessclub.jp/bbs3/0043/superbeg17558 …
SELECT
T傷病名マスタ取込用.傷病名コード,
T傷病名マスタ取込用.傷病名 As 傷病名,
T傷病名マスタ.傷病名 As 傷病名,
T傷病名マスタ取込用.ショウビョウメイカナ as ショウビョウメイカナ,
T傷病名マスタ.ショウビョウメイカナ as ショウビョウメイカナ,
T傷病名マスタ取込用.ICD10コード as ICD10コード,
T傷病名マスタ.ICD10コード as ICD10コード,
T傷病名マスタ取込用.大分類 as 大分類,
T傷病名マスタ.大分類 as 大分類,
iif([T傷病名マスタ]![傷病名]=[T傷病名マスタ取込用]![傷病名],null,"傷病名")
& iif([T傷病名マスタ]![ショウビョウメイカナ]=[T傷病名マスタ取込用]![ショウビョウメイカナ],null,"ショウビョウメイカナ、")
& iif([T傷病名マスタ]![ICD10コード]=[T傷病名マスタ取込用]![ICD10コード],null,"ICD10コード、")
& iif([T傷病名マスタ]![大分類]=[T傷病名マスタ取込用]![大分類],null,"大分類、")
From T傷病マスタ RIGHT JOIN [T傷病名マスタ取込用] ON [T傷病名マスタ].[傷病名コード] = 傷病名コード
where ((((iif(Nz([T傷病名マスタ]![傷病名])=Nz([T傷病名マスタ取込用]![傷病名]),null,","傷病名、")
& iif(Nz([T傷病名マスタ]![ショウビョウメイカナ]=Nz([T傷病名マスタ取込用]![ショウビョウメイカナ]),null,"ショウビョウメイカナ、")
& iif(Nz([T傷病名マスタ]![ICD10コード]=Nz([T傷病名マスタ取込用]![ICD10コード]),null,"ICD10コード、")
& iif(Nz([T傷病名マスタ]![大分類]=Nz([T傷病名マスタ取込用]![大分類]),null,"大分類、"))is not null));
union
select
T傷病名マスタ.傷病名コード,
T傷病名マスタ.傷病名 as 傷病名,
T傷病名マスタ取込用.傷病名 as 傷病名,
T傷病名マスタ.ショウビョウメイカナ as ショウビョウメイカナ,
T傷病名マスタ取込用.ショウビョウメイカナ as ショウビョウメイカナ,
T傷病名マスタ.ICD10コード as ICD10コード,
T傷病名マスタ取込用.ICD10コード as ICD10コード,
T傷病名マスタ.大分類 as 大分類,
T傷病名マスタ取込用.大分類 as 大分類.
iif([T傷病名マスタ]![傷病名]=[T傷病名マスタ取込用]![傷病名],null,"傷病名、")
& iif([T傷病名マスタ]![ショウビョウメイカナ]=[T傷病名マスタ取込用]![ショウビョウメイカナ],null,"ショウビョウメイカナ、")
& iif([T傷病名マスタ]![ICD10コード]=[傷病名マスタ取込用]![ICD10コード],null,"ICD10コード、")
& iif([T傷病名マスタ]![大分類]=[傷病名マスタ取込用]![大分類],null,"大分類、")
ON T傷病名マスタ LEFT JOIN T傷病名マスタ取込用 on T傷病名マスタ.傷病名コード=T傷病名マスタ取込用.傷病名コード
where ((((iif(Nz([T傷病名マスタ]![傷病名])=Nz([T傷病名マスタ取込用]![傷病名]),null,","傷病名、")
& iif(Nz([T傷病名マスタ]![ショウビョウメイカナ]=Nz([T傷病名マスタ取込用]![ショウビョウメイカナ]),null,"ショウビョウメイカナ、")
& iif(Nz([T傷病名マスタ]![ICD10コード]=Nz([T傷病名マスタ取込用]![ICD10コード]),null,"ICD10コード、")
& iif(Nz([T傷病名マスタ]![大分類]=Nz([T傷病名マスタ取込用]![大分類]),null,"大分類、"))is not null));
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
>フリーで公開されているCSVファイルをインポートしてテーブルを作成したのですが
使用ソフトがAccessだとして回答します。
まず、CSVファイルのインポート、が間違いです。
「テーブルのリンク」で、CSVファイルを直接にリンクするのが正解。
CSVファイルに変更があったら「リンクされているCSVファイルを置き換えるだけ」で良いです。
あと、質問者さんのように「不一致クエリで追加分だけ探してから追加」とか「JOINで不一致分だけ探してから更新」とかは、速度が低下するので避けましょう。
「外部のCSVファイルをリンクするのは嫌だ。データベースに取り込みたい」と言う場合、追加と更新で最も早いのは「テーブルそのものを削除して、空のテーブルを新規で作って、新規テーブルに無条件にインポートする」です。
これは「全レコードを無条件に削除して、無条件にインポートする」よりも早いです。
いくら「全レコードを無条件に削除」と言ったって、レコード削除は1レコードづつ繰り返すので、レコード数が膨れればパフォーマンスが落ちます。
また、レコードの削除、追加、更新は、ガベージコレクションが増える要因になり、Accessはガベージコレクションのパージに失敗してデータベースの修復を強要される事が良くあります。
それを避ける為にも「CSVの直リンク」や「テーブルそのものを削除して、空のテーブルを新規で作って、新規テーブルに無条件にインポートする」などの方法を取らないといけません。
質問者さんの方法は「正当」ですが、正当過ぎて処理効率が悪すぎです。
、
No.2
- 回答日時:
良く見てませんけど
is not null)); ←このセミコロンは削除
union
select
( と ) の数が有っていないような?
SELECT
T傷病名マスタ取込用.傷病名コード,
T傷病名マスタ取込用.傷病名 As 傷病名,
・・・
union
select
T傷病名マスタ.傷病名コード,
T傷病名マスタ.傷病名 as 傷病名,
・・・
同名なのに AS で置き換える必要はありません
また
Select ・・・・
Union
Select ・・・・
の場合には最初のSelect文のフィールド名が
クエリの結果のフィールド名として採用されます。
Unionでくっ付ける前の其々のSelect文で正しく表示されるか確認してみてください。
No.3
- 回答日時:
追加で、気になった点を
1)同じフィールド名はOK?
以下から始まる4組で、フィールド名を同じにしているがOK?
> T傷病名マスタ取込用.傷病名 As 傷病名,
> T傷病名マスタ.傷病名 As 傷病名,
・・・・
> T傷病名マスタ取込用.大分類 as 大分類,
> T傷病名マスタ.大分類 as 大分類,
また、テーブル名先頭の T が全角/半角混在するけど・・・
2)RIGHT JOIN の ON 部分で、テーブルの修飾が無いものがある
> From T傷病マスタ RIGHT JOIN [T傷病名マスタ取込用] ON [T傷病名マスタ].[傷病名コード] = 傷病名コード
また、テーブル名を確認する(T傷病マスタ ? T傷病名マスタ ?)
3)SELECT 部分の IIF にも Nz は必要?
4)WHERE 部分の IIF は不要で、そのまま判別してみたら・・・・
(Nz(T傷病名マスタ.傷病名)<>Nz(T傷病名マスタ取込用.傷病名)) OR ・・・
5)2つ目の SELECT に FROM が無いような・・・
上側 SELECT の雰囲気は以下(動かないかも:未検証)
SELECT
Q2.傷病名コード,
Q1.傷病名,
Q2.傷病名 AS 傷病名N,
Q1.ショウビョウメイカナ,
Q2.ショウビョウメイカナ AS ショウビョウメイカナN,
Q1.ICD10コード,
Q2.ICD10コード AS ICD10コードN,
Q1.大分類,
Q2.大分類 AS 大分類N,
MID(IIF(Nz(Q1.傷病名)=Nz(Q2.傷病名),"","、傷病名")
& IIF(Nz(Q1.ショウビョウメイカナ)=Nz(Q2.ショウビョウメイカナ),"","、ショウビョウメイカナ")
& IIF(Nz(Q1.ICD10コード)=Nz(Q2.ICD10コード),"","、ICD10コード")
& IIF(Nz(Q1.大分類)=Nz(Q2.大分類),"","、大分類")
,2) AS 変更部分
FROM T傷病名マスタ AS Q1 RIGHT JOIN T傷病名マスタ取込用 AS Q2 ON Q1.傷病名コード = Q2.傷病名コード
WHERE (Nz(Q1.傷病名)<>Nz(Q2.傷病名))
OR (Nz(Q1.ショウビョウメイカナ)<>Nz(Q2.ショウビョウメイカナ))
OR (Nz(Q1.ICD10コード)<>Nz(Q2.ICD10コード))
OR (Nz(Q1.大分類)<>Nz(Q2.大分類));
2つ目の SELECT では、RIGHT JOIN を LEFT JOIN に変更し、
SELECT 部分の Q2.傷病名コード, を Q1.傷病名コード, にすると、できるかも・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- Excel(エクセル) vba userformで漢字を全角カタカナに 2 2022/07/24 15:38
- Excel(エクセル) IFERROR、SMALL関数について 2 2022/08/22 23:40
- 雇用保険 雇用保険の傷病手当金は、受給要件として、離職後に公共職業安定所に行き、休職の申し込みを終えていること 4 2023/01/12 19:56
- 就職・退職 傷病手当の退職時の有給消化について。 現在傷病手当を受給中で6月末に退職予定です。 しかし有給(正確 2 2022/06/27 11:29
- 健康保険 傷病手当金について教えてください。 傷病手当金を申請しようと思ってるのですが 傷病手当ての書類は協会 2 2022/08/02 00:18
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- 健康保険 傷病手当金について 傷病手当金の在職中の分の申請は、退職後でも可能ですか? 調べてみると、退職後は健 2 2023/01/10 21:35
- 健康保険 新型コロナウィルスにかかり 1/26〜2/5まで自宅療養していました。 会社では欠勤にして 傷病手当 2 2022/04/10 10:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL文で、合計が0のレコードを...
-
表の結合の仕方
-
アクセスにて月末日付を取得し...
-
FROM句にサブクエリ使えませんか
-
for whichの使い方
-
差し込み後、元データを変更し...
-
pythonにてseleniumを使うも、...
-
マイクラPC版のコマンドで効率...
-
グループ毎の最大値を持つデー...
-
次の並び替え問題を教えてくだ...
-
Exel VBA 別ブックから該当デ...
-
処理件数を非表示にしたい
-
エクセルで最後の文字だけ置き...
-
chatgptでつくってもらったコー...
-
特定の文字列で列を区切るには?
-
英語ができる方、問題をお願い...
-
ExcelのVBAコードについて教え...
-
パイソンプログラム
-
広告ブロッカーのアドカードと...
-
外部参照してるキーを主キーに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
Accessの実行時エラーについて
-
ACCESS ツリービューの作り方
-
日付により変動する「単価」を...
-
異なるデータベース間のテーブ...
-
前月の取得について
-
アクセス フィールド名に変数...
-
ACCESSでクエリ作成時複数のフ...
-
DBが複雑すぎる
-
ACCESS 商品毎の最新の単価を設...
-
最大値を含むレコードの抽出
-
Access2013で商品に複数の単価...
-
アクセスにて月末日付を取得し...
-
ACCESSでDLookUpすると、不正な...
-
Excel VBA ADODB
-
フィールドの数値を四捨五入の...
-
Excelのユーザーフォームで別の...
-
店舗での日報での良い例を教え...
-
SQLserverでのUPDATE文について
おすすめ情報