Microsoft Access 掲示板

クエリの数を圧縮したい

24 コメント
views
4 フォロー

連投になってしまい申し訳ありません。

フィールド:住所1
テーブル:T_出力
レコードの更新:Replace([T_出力].[住所1],[T_置換用テーブル].[置換前],[T_置換用テーブル].[置換後])
抽出条件:Like "" & [T_置換用テーブル].[置換前] & ""

という校正の更新クエリがT_出力のフィールドの数だけあるのですが、1つのクエリにまとめて記述することは可能でしょうか?

レコードの更新のフィールド名を変え、抽出条件のまたは に同じ抽出条件を記述してみたところ、型変換エラーが出ました。

Anko
作成: 2023/11/16 (木) 16:20:27
最終更新: 2023/11/16 (木) 16:46:20
通報 ...
1

それぞれのフィールドの同じように設定すればいいのでは。

ただし、抽出条件は1行ずつずらして設定します。(OR条件になる)
あるいは、抽出条件をなしにてしもいいでしょう。

2
Anko 2023/11/17 (金) 08:34:46 修正 7fdfc@46fae >> 1

それで試しましたが型変換エラーが起きました。
置換用のテーブル・T_出力のテーブルはいずれのフィールドも短いテキスト型です。

また、総レコード4件、住所1と住所2だけを横並びにしてOr条件で更新をかけてみたところ、
12件の型変換エラーが出ました。
住所1はあるが住所2はない(住所2がNull?)レコードが実行前に12件あったので
Nullを短いテキスト型に更新しようとしてるのでは?と考えています

3

Nz関数でNullを""に変換したらどうでしょう。

レコードの更新:Replace(Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],[T_置換用テーブル].[置換後])

Nz 関数 - Microsoft サポート

4

型変換エラーは出なくなりました!ありがとうございます。

もう一点質問なのですが、T_置換用テーブルの中に、置換前" "(全角スペース)、置換後" "(半角スペース)があります。
置換後も、スペースを含むレコードが抽出されてしまいます。これは仕方ないことなのでしょうか?

5

置換後も、スペースを含むレコードが抽出されてしまいます。これは仕方ないことなのでしょうか?

" "(半角スペース)に変換はできていますか。
また、「スペースを含むレコードが抽出されてしまいます」とは、どのような抽出条件を設定した時の話でしょうか。

6

全角スペースから半角スペースへの置換は問題なく行われています。
抽出条件:Like "" & [T_置換用テーブル].[置換前] & ""  です。
合計で7つフィールドを並べ、OR条件で同じ抽出条件を記述しています。

恐らく全角スペースと半角スペースが区別されず、抽出条件に引っかかってしまっています。
置換自体は問題なく行えるようになったので、「置換したのにまだレコードが残っていて気持ち悪い」くらいの問題です。

7
8

試しに住所1だけにしてみたのですが、
式1: InStr(1,[T_出力].[住所1],"[T_置換用テーブル].[置換前]",0)
抽出条件:>0にしてみたのですが、1件も抽出されませんでした。
どのように書けばよいのでしょうか?

9

式1: InStr(1,[T_出力].[住所1],"[T_置換用テーブル].[置換前]",0)

"で囲んだらそれは文字列です。つまり「[T_置換用テーブル].[置換前]」という文字列と比較していることになりますね。

10

""をとってみましたが、見つかりません、パラメータや別名を確認してくださいというエラーが出ました。

11

正しい抽出条件はどのように記述すればよろしいでしょうか。

13

[T_置換用テーブル].[置換前] のテーブル名、フィールド名に間違いはないですか。

間違いないなら、現状のクエリのSQLを提示してください。

15

下記提示致します。

14
Anko 2023/11/21 (火) 11:26:28 修正 7fdfc@46fae
UPDATE T_出力, T_置換用テーブル SET T_出力.住所1 = Replace(Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],[T_置換用テーブル].[置換後])
WHERE (((T_出力.住所1) Like "*" & [T_置換用テーブル].[置換前] & "*"));

住所1のみのSQLです。

16

SQLを見る限りは問題なさそうですね。
簡単なサンプルを作成して確認してみましたが、問題なく実行できました。

クエリを新規作成して、SQLビューに提示のSQLをコピーして貼り付けて実行したらどうなりますか。

17

すみません、現状のSQLとは、Instrに書き換えた方(エラーが出ている方)のことでしょうか?

18
hatena 2023/11/21 (火) 13:03:27 修正

""をとってみましたが、見つかりません、パラメータや別名を確認してくださいというエラーが出ました。

このエラーが出ているクエリのSQLを提示してください。

エラーの出ないSQLを提示されても意味ないですよね。

一応、下記のSQLを実行してみましたが、エラーなく実行できました。

UPDATE T_出力, T_置換用テーブル
SET T_出力.住所1 = Replace(Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],[T_置換用テーブル].[置換後])
WHERE InStr(1,Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],0)>0;
19

SQLビューを開こうとしましたが、'InStr(1,[T_出力].[住所1],[T_置換用テーブル].[置換前],0)'が見つかりません、パラメータや別名が正しいこと、、、を確認してくださいというエラーが出ます。

20

見にくいかもしれませんが、スクショでのデザインビューです。画像1

21

クエリを新規作成して、SQLビューにして、下記のSQLを貼り付けて実行するとどうなりますか。

UPDATE T_出力, T_置換用テーブル
SET T_出力.住所1 = Replace(Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],[T_置換用テーブル].[置換後])
WHERE InStr(1,Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],0)>0;
22

デザインビュー見ました。
更新するフィールドと抽出条件を設定するフィールドは別にしないと。

上記の回答で新規作成したクエリをデザインビューにして違いを確認してください。

23
Anko 2023/11/21 (火) 13:25:03 修正 7fdfc@46fae >> 19

HatenaさんのSQLビューをコピーしてデザインビューを確認したところ、住所1とInstrの2つに分かれました。1つのフィールドに書こうとしていたから上手くいかなかったのですね。

24

式1: InStr(1,Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],0)
というような演算フィールドは更新できませんからね。