電子書籍の厳選無料作品が豊富!

参照TBのF1、F6、F8と修正TBのF1、F6、F8が同じだったら、修正TBのF2、F7を参照TBのF2、F7に置き換えたい。

SQLの書き方がわかりません。

UPDATE 修正TB
INNER JOIN 参照TB
ON (修正TB.F1 = 参照TB.F1 And 修正TB.F6 = 参照TB.F6 And 修正TB.F8 = 参照TB.F8)
SET 修正TB.F2 = 参照TB.F2 , 修正TB. F7 = 参照TB.F7

又は、

UPDATE 修正TB
SET 修正TB.F2=参照TB.F2 , 修正TB.F7=参照TB.F7
WHERE EXISTS
( SELECT 1 FROM 参照TB
WHERE 修正TB.F1=参照TB.F1 And 修正TB.F6=参照TB.F6 And 修正TB.F8=参照TB.F8 )"

どこがいけないでしょうか?

A 回答 (3件)

以下でどうですか。



UPDATE 修正TB INNER JOIN 参照TB ON (修正TB.F8 = 参照TB.F8) AND (修正TB.F6 = 参照TB.F6) AND (修正TB.F1 = 参照TB.F1) SET 修正TB.F2 = [参照TB].[F2], 修正TB.F7 = [参照TB].[F7]
WHERE (((修正TB.F1)=[参照TB].[F1]) AND ((修正TB.F6)=[参照TB].[F6]) AND ((修正TB.F8)=[参照TB].[F8]));

この回答への補足

ご回答、ありがとうございます。
でも、
「実行時エラー3135  JOIN操作の構文エラーです。」
となってしまいます。

再度のご指導をお願い致します。

補足日時:2013/05/14 21:03
    • good
    • 0
この回答へのお礼

私の間違いでした。
参照TBに間違ったテーブル名を記述して実験してました。

おかげ様で、うまく動いています。

ありがとうございました。

お礼日時:2013/05/14 23:29

No1です。



参照TB

F1   F2    F6   F7   F8
A1  あああ  B1  いいい  C1
A2  えええ  B21  えええ  C21
A3  かきく  B3  たちつ  C3


修正TB

F1   F2   F6   F7   F8
A1  959   B1  363   C1
A2  965   B23  111   C23
A3  115   B3  499   C3
A1  236   B1  546   C1


のようなサンプルテーブルで確認していますが。
利便上、F3とかF4などのフィールドは省いています。
このようなテーブルでクエリを実行すると、

F1   F2   F6   F7    F8
A1  あああ  B1  いいい  C1
A2  965   B23  111   C23
A3  かきく  B3  たちつ  C3
A1  あああ  B1  いいい  C1

のように修正TBは更新されます。補足のような
エラーはでませんが、提示したSQL文を正しく
クエリのSQLビューに貼り付けたのでしょうか。
あるいは、実際のテーブルに合わせてSQL文を
書き換えてエラーが出たのでしょうか。
あるいは、質問通りにテーブルは参照TB、修正TB、
フィールドはF1、F2、F6、F7、F8とした上で
エラーが出たのでしょうか。
    • good
    • 0
この回答へのお礼

タイミングが悪かったせいか、ベストアンサーにした後のお礼ですが、ありがとうございました。

お礼日時:2013/05/14 23:34

【要旨】


空白(Null)のフィールドも値が一致したものとみなして結合する場合、
Null以外の値に変換してやる必要があります。
(例えばNz関数で空文字や0に変換したり、「&」を使用したテキスト
 連結で文字列化する、など)

UPDATE 修正TB
INNER JOIN 参照TB
ON (修正TB.F1 & "◆" & 修正TB.F6 & "◆" & 修正TB.F8=参照TB.F1 & "◆" & 参照TB.F6 & "◆" & 参照TB.F8)
SET 修正TB.F2 = 参照TB.F2, 修正TB.F7 = 参照TB.F7;


【詳細】

ご提示のSQL文を使用して、こちらのサンプルデータを処理したところ、
問題なく更新されました。
(サンプルには主キーなどの設定なし)
★但し、「修正TB. F7」に余計な半角Spaceがあったのでそこは修正★


> 参照TBのF1、F6、F8と修正TBのF1、F6、F8が同じだったら、
> 修正TBのF2、F7を参照TBのF2、F7に置き換えたい。

とのことですが、ひょっとして、F1・F6・F8のどれかが空白(Null)の場合も、
更新対象としたい、ということでしょうか。


上記の理解で正しければ、以下の方法で対応できます:

<修正案・1>
 データ型が「文字列型」のフィールドについてはNullと空文字を同一と
 みなしてよく、「数値型」についてはNullと0を同一とみなしてよい場合:
 (文字列型のフィールドで、空文字を許可していない場合も含む)

UPDATE 修正TB
INNER JOIN 参照TB
ON (Nz(修正TB.F1) = Nz(参照TB.F1) And Nz(修正TB.F6) = Nz(参照TB.F6) And Nz(修正TB.F8) = Nz(参照TB.F8))
SET 修正TB.F2 = 参照TB.F2 , 修正TB.F7 = 参照TB.F7


<修正案・2>
 「文字列型」のフィールドでのNullと空文字の同一視はよいが、
 「数値型」でのNullと0は区別を必須とする場合:
 (「◆」は各フィールドの値の区切りとするために使用。実際のデータ中に
  この文字が含まれる場合は、データに含まれることのない文字・記号を
  代わりに使用して下さい)

UPDATE 修正TB
INNER JOIN 参照TB
ON (修正TB.F1 & "◆" & 修正TB.F6 & "◆" & 修正TB.F8=参照TB.F1 & "◆" & 参照TB.F6 & "◆" & 参照TB.F8)
SET 修正TB.F2 = 参照TB.F2, 修正TB.F7 = 参照TB.F7;


・・・以上です。
    • good
    • 0
この回答へのお礼

>問題なく更新されました。
再度、点検しました。

>余計な半角Space
それと、
INNER JOIN の参照TBに間違ったテーブル名を記述して実験してました。

おかげで、こちらも問題なく更新されました。

ありがとうございます。

お礼日時:2013/05/14 23:27

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