好きなおでんの具材ドラフト会議しましょう

お世話になります。

更新のSQL文を考えているのですが、なかなかうまく動きません。
どなたか教えていただけないでしょうか?

やりたいことは、"KSK011"と"KSJ01"で"HINB"という項目で
マッチングしていたら、KSJ01の"ZAIK"をKSK011の"ZZAI"
にセットしたいと考えています。

UPDATE KSK011 SET KSK011.ZZAI = KSJ01.ZAIK
WHERE KSK011.HINB IN
(SELECT KSK011.HINB FROM(KSK011) INNER JOIN KSJ01 ON KSK011.
HINB = KSJ01.HINB)

動作させると、FROMのカッコが不適切とエラーがでます。カッコを取ると”マルチパート識別子 ??KSJ01.ZAIK?? をバインドできませんでした。”となります。どこがまずいのでしょうか?

A 回答 (2件)

下記の書き方だと、UPDATE句が参照可能なのはKSK011のみです。


WHERE句の IN内にサブクエリで書かれても「KSJ01」はメインで参照はできません。あくまでWHERE条件として使われます。

> UPDATE KSK011
> SET KSK011.ZZAI = KSJ01.ZAIK
>WHERE KSK011.HINB IN
>(SELECT KSK011.HINB FROM(KSK011)
> INNER JOIN KSJ01 ON KSK011.HINB = KSJ01.HINB);

上記をわかりやすくSELECT句で表現すると以下となります。
select xxx.colx1,zzz.colz1
from xxx
inner join zzz on zzz.colz1 = xxx.colx1
where xxx.colx1 in (select coly1 from yyy)

メインのSELECT句が参照できるのはFROM句で指定されたxxxと
ジョインしているzzzだけです。
yyyはin句の評価でしか使われません。

FROM句に入れていないのでSELECT候補ではありません。
FROM内にないものは参照できないと考えてください。

UPDATE文を考える時もSELECT文を考えてから置き換えたほうがわかりやすいです。SELECTできなければUPDATEもできません。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。

WHERE句なので、評価としてしか使えないんですね。
納得しました。 

丁寧な説明ありがとうございます。

お礼日時:2009/05/28 16:33

サブクエリの中でJOINしたところで、更新をするメインクエリがKSJ01を参照できないわけですから、そういうエラーになります。


SQL Serverの場合、正しくは以下の通りです。

UPDATE KSK011
SET KSK011.ZZAI = KSJ01.ZAIK
FROM KSK011
INNER JOIN KSJ01 ON KSK011.HINB = KSJ01.HINB

この回答への補足

jamshid6さん素早いアドバイスありがとうございます。

メインクエリでKSJ01を参照できないと言ってもらっていますが、
私の書いたほうの1行目でしょうか?
初歩的なことですが、KSJ01と書いてなぜ参照できないんでしょうか?

補足日時:2009/05/28 15:16
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

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


おすすめ情報