Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Access 2021)
複数フィールドの更新クエリ
投稿日時: 23/10/30 17:18:18
投稿者: 2365

横長のデータベースを使用しています。
AテーブルとBテーブルを比較して(同じ項目を持っている)、@〜㉚までのフィールドに対し、値がそれぞれ同じであれば空白に、もし異なればAのテーブルの値を正にしたテーブルを作成したいと考えています。
当初フィールドの抽出条件でA@=B@であればA@を空欄に、そうでなければA@はそのまま、という更新クエリを組もうと思いました。
ですがこれだと@〜㉚まで抽出条件を「または」で組んだところで、更新値を""(空白)としたところ、余計なものまで空白になってしまうことに気づきました。
 
 
例)    A@ B@ AA BA AB BB……
○○商店  100 100  200 150 300 300
××店 150 100 250 250 200 100
▲▲会社 150 200 300 280 200 400
 
上記のような例の場合、
      A@ AA AB……
○○商店     200 300
××店 150    200
▲▲会社 150 300  200
このようにテーブルを更新したい(もしくは新しくテーブルを作成したい)と考えていますが、
先に書いたようにクエリの抽出条件を空白にして更新をかけると抽出されたレコードの、抽出条件
と違うフィールドも空白になってしまいます。(上記の例で言うと▲▲商店以外は全て空白になります)
このような場合、どうすれば一致したフィールドだけ空白にできますでしょうか?
 
もしかしてフィールド毎に抽出→更新を30回繰り返さないとダメですかね?
どなたかご教示いただけないでしょうか。
どうぞ宜しくお願いいたします。

投稿日時: 23/10/30 17:30:16
投稿者: 2365

先程の件、見づらい上に間違えていました。。。。
          A@    B@    AA    BA    AB    BB
○○商店       100    100    200    150    300    300
××店        150    100    250    250    200    100
▲▲会社       150    200    300    280    200    400
 
  ↓  上記を、以下の様にしたいです。
 
          A@    AA    AB
○○商店            200     
××店        150         200
▲▲会社       150    300    200
 
どうぞ宜しくお願いいたします。

回答
投稿日時: 23/10/31 10:37:57
投稿者: sk

引用:
AテーブルとBテーブルを比較して(同じ項目を持っている)、
@〜㉚までのフィールドに対し、値がそれぞれ同じであれば空白に、
もし異なればAのテーブルの値を正にしたテーブルを作成したいと考えています。

・[Aテーブル]でも[Bテーブル]でもない別のテーブルに
 レコードを追加したい。
 
・[Aテーブル]もしくは[Bテーブル]のいずれかのテーブルの
 レコードの各フィールドの値を更新したい。
 
どちらの意味でおっしゃっているのでしょうか。
 
また、フィールド[会社名]をキーとして[Aテーブル]と[Bテーブル]を
結合するとして、一方のテーブルにはあってもう一方のテーブルにはない
レコードが存在した場合はどのようになさりたいのでしょうか。
 
引用:
もしかしてフィールド毎に抽出→更新を30回繰り返さないとダメですかね?

フィールドごとに比較してレコードを抽出するのであれば、
基本的にはそういうことになります。
 
引用:
横長のデータベースを使用しています。

テーブルの正規化を検討されることをお奨めします。

投稿日時: 23/10/31 10:45:38
投稿者: 2365

sk様、ご返信有り難うございます。

引用:

・[Aテーブル]でも[Bテーブル]でもない別のテーブルに
 レコードを追加したい。
  
・[Aテーブル]もしくは[Bテーブル]のいずれかのテーブルの
 レコードの各フィールドの値を更新したい。
どちらの意味でおっしゃっているのでしょうか。

 
どちらでも良いのですが、どちらかというと前者の方が望ましいです。
また今回のテーブルの場合は、どちらか一方にしか存在しないレコードはありませんのでその辺りは考慮しないで大丈夫です。
 
新しいテーブルへ、値が同じモノは空白に、違うモノはAの価格を、それぞれ追加するような事は可能でしょうか?
引き続き、ご教示いただけますと幸いです。

回答
投稿日時: 23/10/31 11:16:51
投稿者: sk

引用:
どちらかというと前者の方が望ましいです。

引用:
・[Aテーブル]でも[Bテーブル]でもない別のテーブルに
 レコードを追加したい。

引用:
どちらか一方にしか存在しないレコードはありません

・仮にレコードの追加先となる空のテーブルを[Cテーブル]とする。
 
・[Aテーブル], [Bテーブル], [Cテーブル]の構造は全て同一であり、
 テキスト型のフィールド[会社名]、および 30 個の数値型のフィールド
  ([フィールド1]〜[フィールド30])が定義されている。
 
以上のような前提である場合は、例えば次のような追加クエリを
実行なさればよろしいでしょう。
 
( SQL ビュー)
-----------------------------------------------------------
INSERT INTO [Cテーブル]
      ([会社名],
       [フィールド1],
       [フィールド2],
       [フィールド3],
       [フィールド4],
       [フィールド5],
       [フィールド6],
       [フィールド7],
       [フィールド8],
       [フィールド9],
       [フィールド10],
       [フィールド11],
       [フィールド12],
       [フィールド13],
       [フィールド14],
       [フィールド15],
       [フィールド16],
       [フィールド17],
       [フィールド18],
       [フィールド19],
       [フィールド20],
       [フィールド21],
       [フィールド22],
       [フィールド23],
       [フィールド24],
       [フィールド25],
       [フィールド26],
       [フィールド27],
       [フィールド28],
       [フィールド29],
       [フィールド30])
SELECT [Aテーブル].[会社名],
       IIf([Aテーブル].[フィールド1]=[Bテーブル].[フィールド1],Null,[Aテーブル].[フィールド1]) AS [フィールド1],
       IIf([Aテーブル].[フィールド2]=[Bテーブル].[フィールド2],Null,[Aテーブル].[フィールド2]) AS [フィールド2],
       IIf([Aテーブル].[フィールド3]=[Bテーブル].[フィールド3],Null,[Aテーブル].[フィールド3]) AS [フィールド3],
       IIf([Aテーブル].[フィールド4]=[Bテーブル].[フィールド4],Null,[Aテーブル].[フィールド4]) AS [フィールド4],
       IIf([Aテーブル].[フィールド5]=[Bテーブル].[フィールド5],Null,[Aテーブル].[フィールド5]) AS [フィールド5],
       IIf([Aテーブル].[フィールド6]=[Bテーブル].[フィールド6],Null,[Aテーブル].[フィールド6]) AS [フィールド6],
       IIf([Aテーブル].[フィールド7]=[Bテーブル].[フィールド7],Null,[Aテーブル].[フィールド7]) AS [フィールド7],
       IIf([Aテーブル].[フィールド8]=[Bテーブル].[フィールド8],Null,[Aテーブル].[フィールド8]) AS [フィールド8],
       IIf([Aテーブル].[フィールド9]=[Bテーブル].[フィールド9],Null,[Aテーブル].[フィールド9]) AS [フィールド9],
       IIf([Aテーブル].[フィールド10]=[Bテーブル].[フィールド10],Null,[Aテーブル].[フィールド10]) AS [フィールド10],
       IIf([Aテーブル].[フィールド11]=[Bテーブル].[フィールド11],Null,[Aテーブル].[フィールド11]) AS [フィールド11],
       IIf([Aテーブル].[フィールド12]=[Bテーブル].[フィールド12],Null,[Aテーブル].[フィールド12]) AS [フィールド12],
       IIf([Aテーブル].[フィールド13]=[Bテーブル].[フィールド13],Null,[Aテーブル].[フィールド13]) AS [フィールド13],
       IIf([Aテーブル].[フィールド14]=[Bテーブル].[フィールド14],Null,[Aテーブル].[フィールド14]) AS [フィールド14],
       IIf([Aテーブル].[フィールド15]=[Bテーブル].[フィールド15],Null,[Aテーブル].[フィールド15]) AS [フィールド15],
       IIf([Aテーブル].[フィールド16]=[Bテーブル].[フィールド16],Null,[Aテーブル].[フィールド16]) AS [フィールド16],
       IIf([Aテーブル].[フィールド17]=[Bテーブル].[フィールド17],Null,[Aテーブル].[フィールド17]) AS [フィールド17],
       IIf([Aテーブル].[フィールド18]=[Bテーブル].[フィールド18],Null,[Aテーブル].[フィールド18]) AS [フィールド18],
       IIf([Aテーブル].[フィールド19]=[Bテーブル].[フィールド19],Null,[Aテーブル].[フィールド19]) AS [フィールド19],
       IIf([Aテーブル].[フィールド20]=[Bテーブル].[フィールド20],Null,[Aテーブル].[フィールド20]) AS [フィールド20],
       IIf([Aテーブル].[フィールド21]=[Bテーブル].[フィールド21],Null,[Aテーブル].[フィールド21]) AS [フィールド21],
       IIf([Aテーブル].[フィールド22]=[Bテーブル].[フィールド22],Null,[Aテーブル].[フィールド22]) AS [フィールド22],
       IIf([Aテーブル].[フィールド23]=[Bテーブル].[フィールド23],Null,[Aテーブル].[フィールド23]) AS [フィールド23],
       IIf([Aテーブル].[フィールド24]=[Bテーブル].[フィールド24],Null,[Aテーブル].[フィールド24]) AS [フィールド24],
       IIf([Aテーブル].[フィールド25]=[Bテーブル].[フィールド25],Null,[Aテーブル].[フィールド25]) AS [フィールド25],
       IIf([Aテーブル].[フィールド26]=[Bテーブル].[フィールド26],Null,[Aテーブル].[フィールド26]) AS [フィールド26],
       IIf([Aテーブル].[フィールド27]=[Bテーブル].[フィールド27],Null,[Aテーブル].[フィールド27]) AS [フィールド27],
       IIf([Aテーブル].[フィールド28]=[Bテーブル].[フィールド28],Null,[Aテーブル].[フィールド28]) AS [フィールド28],
       IIf([Aテーブル].[フィールド29]=[Bテーブル].[フィールド29],Null,[Aテーブル].[フィールド29]) AS [フィールド29],
       IIf([Aテーブル].[フィールド30]=[Bテーブル].[フィールド30],Null,[Aテーブル].[フィールド30]) AS [フィールド30]
FROM [Aテーブル]
INNER JOIN [Bテーブル]
ON [Aテーブル].[会社名] = [Bテーブル].[会社名];
-----------------------------------------------------------

投稿日時: 23/10/31 19:42:21
投稿者: 2365

SK様、引き続きのご連絡有難うございます。
教えていただいたクエリを試してみます。
Accessは初心者に毛が生えた程度なので、非常に助かりました。
SK様のメモを頼りに頑張ってみます!

トピックに返信