プロが教える店舗&オフィスのセキュリティ対策術

フリーで公開されている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件)

>フリーで公開されているCSVファイルをインポートしてテーブルを作成したのですが



使用ソフトがAccessだとして回答します。

まず、CSVファイルのインポート、が間違いです。

「テーブルのリンク」で、CSVファイルを直接にリンクするのが正解。

CSVファイルに変更があったら「リンクされているCSVファイルを置き換えるだけ」で良いです。

あと、質問者さんのように「不一致クエリで追加分だけ探してから追加」とか「JOINで不一致分だけ探してから更新」とかは、速度が低下するので避けましょう。

「外部のCSVファイルをリンクするのは嫌だ。データベースに取り込みたい」と言う場合、追加と更新で最も早いのは「テーブルそのものを削除して、空のテーブルを新規で作って、新規テーブルに無条件にインポートする」です。

これは「全レコードを無条件に削除して、無条件にインポートする」よりも早いです。

いくら「全レコードを無条件に削除」と言ったって、レコード削除は1レコードづつ繰り返すので、レコード数が膨れればパフォーマンスが落ちます。

また、レコードの削除、追加、更新は、ガベージコレクションが増える要因になり、Accessはガベージコレクションのパージに失敗してデータベースの修復を強要される事が良くあります。

それを避ける為にも「CSVの直リンク」や「テーブルそのものを削除して、空のテーブルを新規で作って、新規テーブルに無条件にインポートする」などの方法を取らないといけません。

質問者さんの方法は「正当」ですが、正当過ぎて処理効率が悪すぎです。
    • good
    • 0

良く見てませんけど


is not null)); ←このセミコロンは削除
union
select

( と ) の数が有っていないような?

SELECT
T傷病名マスタ取込用.傷病名コード,
T傷病名マスタ取込用.傷病名 As 傷病名,
・・・
union
select
T傷病名マスタ.傷病名コード,
T傷病名マスタ.傷病名 as 傷病名,
・・・
同名なのに AS で置き換える必要はありません
また
Select ・・・・
Union
Select ・・・・
の場合には最初のSelect文のフィールド名が
クエリの結果のフィールド名として採用されます。

Unionでくっ付ける前の其々のSelect文で正しく表示されるか確認してみてください。
    • good
    • 0

追加で、気になった点を



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.傷病名コード, にすると、できるかも・・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す