• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:UPDATEを使ったSQL文にて)

UPDATE文の使用時にエラーが発生する問題について

このQ&Aのポイント
  • UPDATE文を使用して、特定の条件に一致する行のデータを更新する方法を考えていますが、エラーが発生しています。
  • 具体的には、カッコの位置が不適切であるというエラーが表示されます。また、カッコを取ると別のエラーが発生します。
  • このエラーの原因としては、マルチパート識別子のバインドが正しく行われていない可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.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もできません。

smile788
質問者

お礼

詳しい説明ありがとうございます。 WHERE句なので、評価としてしか使えないんですね。 納得しました。  丁寧な説明ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

サブクエリの中でJOINしたところで、更新をするメインクエリがKSJ01を参照できないわけですから、そういうエラーになります。 SQL Serverの場合、正しくは以下の通りです。 UPDATE KSK011 SET KSK011.ZZAI = KSJ01.ZAIK FROM KSK011 INNER JOIN KSJ01 ON KSK011.HINB = KSJ01.HINB

smile788
質問者

補足

jamshid6さん素早いアドバイスありがとうございます。 メインクエリでKSJ01を参照できないと言ってもらっていますが、 私の書いたほうの1行目でしょうか? 初歩的なことですが、KSJ01と書いてなぜ参照できないんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQLでSELECTした一覧をUPDATEする方法を教えてください。

    AのテーブルをINNER JOINのWHERE文を用いて、selectした結果の項目にBテーブルの内容をUPDATEしたいのですが、 下記方法でうまくいきません。 解決方法を教えてください。 よろしくお願いいたします。 SELECT A.PointZan FROM A INNER JOIN B ON A.Code = B.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止') UPDATE A SET PointZan = (SELECT B.PointZan FROM B INNER JOIN A ON B.Code = A.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止'))

  • update文におけるwhereとjoinの違いについて

    はじめまして。 副問い合わせを使ったUPDATE文でわからない点があり、質問させていただきます。 使用しているDBはORACLE10gです。 SALARYとEMPLOYEESという二つのテーブルがあり、SALARY列とEMPLOYEES列には主キーとなるEMPLOYEEID列があります。 ここで、以下のSQLを発行した際に【1】は正しく更新され、【2】は「ORA-01427:単一行副問い合わせにより2つ以上の行が戻されます」というエラーが出ます。 whereを使った結合とjoinを使った結合は同じだと思っていたのですが、なぜこのように結果が異なるのかがわかりません。 どなたかご教示いただけないでしょうか。 【1】 UPDATE SALARY SET SALARY.AMOUNT = SALARY.AMOUNT + (SELECT AMOUNT FROM EMPLOYEES INNER JOIN SALARY s ON EMPLOYEES.EMPLOYEEID = s.EMPLOYEEID) 【2】 UPDATE SALARY SET SALARY.AMOUNT = SALARY.AMOUNT + (SELECT AMOUNT FROM EMPLOYEES WHERE SALARY.EMPLOYEEID = EMPLOYEES.EMPLOYEEID) 説明不足の点があればご指摘ください。よろしくお願いします。

  • 埋め込みSQLについて

    現在C言語で開発を行っている初級のIT技術者です。 pro*cでは、inner joinやexistsを使うとコンパイルエラーとなってしまいます。 泣く泣く、inを使ってしまいました。例えば以下テーブルがあります。 請求テーブル 識別ID 更新日付 201405 20140922 100177 20140204 258087 20140412 201497 20140711 258055 20140812 履歴テーブル 加入者ID 識別ID(主キー) 2014   201405 5800   587405 2014   258087  8507   874575 以下をパッケージに記載しています。 EXEC SQL SELECT 色々 FROM 請求テーブル WHERE 識別ID IN (SELECT 識別ID FROM 請求テーブル WHERE 加入者ID = 変数) ORDER BY 更新日付 ASC 例えば、変数として2014が来た場合は、履歴テーブルより 2014   201405 2014   258087 が選択されて、請求テーブルの更新日付を見て古い方を取ってくるので 結局258087 20140412が取得されます。この代わりとなる、pro*cで記述できる SQLはどんなのがありますでしょうか?

  • Sql文のUpdateと副問い合わせで困っています。

    お世話になっております。Sql初心者でUpdate文の書き方で困っております。ご教授の程宜しくお願い致します。 下記のような2つのテーブルがあります。 関係はTotalが合計を表すテーブルでDetailが明細を表すテーブルです。OTとNoの組み合わせで一意となります。TotalテーブルのTotalAmountはDetailテーブルのAmountの合計です。 行いたいUpdateは『TotalAmountとTotalの合計が合わないもののみTotalAmountをOTとNoで紐ずくDetailテーブルのAmountの合計で更新する』です。 ■テーブル名:Total ------------------------------------------------------- 列名) OT No TotalAmount ------------------------------------------------------- 20 100000 0 20 100001 0 20 100002 10 ■テーブル名:Detail ------------------------------------------------------- 列名) OT No Amount ------------------------------------------------------- 20 100000 10 20 100000 10 20 100001 20 20 100001 30 20 100002 5 20 100002 5 ■作成したSql update Total set TotalAmount = (select Sum(Amount) from Detail Inner Join Total on Detail.OT = Total.OT and Detail.No = Total.No group by Total.TotalAmount,Total.OT,Detail.OT,Total.No,Detail.No having Total.TotalAmount <> sum(Detail.Amount) ) where OT = (select OT from Detail) and No = (select No from Detail) and TotalAmount <> (select sum(Amount) from Detail) いろいろ試行錯誤しながら作成しましたが『サブクエリは複数の値を返しました ~ 』というエラーが出てしまいます。 つっこみどころ満載だと思いますがご教授の程宜しくお願い致します。

  • sqlについて

    下に書いたsqlのコードの内容(どういう処理でどういう結果になるのか)が知りたいです。 どなたかわかる方教えてください。 select b.ym, b.no,     isnull(e.sumcnt,0)as val, null as bunsi, null as bunbo from (select distinct ym,no from Table_A)b inner join (select ym from Table_B where cd=1)d on b.ym=d.ym left outer join (select b1.ym,b1.no,sum(c1.cnt)as sumcnt from Table_A b1 inner join (select ym from Table_B where cd=1)d1 on b1.ym=d1.ym inner join Table_C c1 on b1.ym=c1.ym group by b1.ym,b1no)e on b.ym=e.ym and b.no=e.no

  • Access2007 の SQL文です。

    宜しくお願いします。 DoCmd.RunSQL ("update 予算月別 inner join 予算実績 on 予算月別.科目ID=予算実績.科目ID " _ & " set 合計金額 =sum(当年予算) where (月度>=開始日) and (月度<=終了日) group by 科目ID; ") これで 実行時エラー '3137': SQL ステートメントの最後には、セミコロン(;)が必要です。 下記のSQL文は実行できました。 これを編集したものです。 DoCmd.RunSQL ("update 予算月別 inner join 予算実績 on 予算月別.科目ID=予算実績.科目ID " _ & " set 金額01 =当年予算 where 月度=開始日 ; ")

  • SQL文のINNER JOIN内での条件付けについて質問です

    SQLの質問です。 先程も質問させて頂いた件(http://okwave.jp/qa4089307.html)に派生した問題なのですが、 Accessのクエリにて SELECT A.*FROM grade_points AS A INNER JOIN [SELECT MAX(enforcement_date) AS MaxDate,grade_id FROM grade_points WHERE (enforcement_date)<=date() GROUP BY grade_id]. AS B ON (A.grade_id = B.grade_id) AND (A.enforcement_date = B.MaxDate); (前回の件のクエリにWHERE (enforcement_date)<=date() の条件を追加しました) というクエリを作ると、SQLを書いた直後の保存前はちゃんと動くのですが、保存後に閉じてから実行しようとすると「入力テーブルまたはクエリ(上記[]内SQL文)が見つかりません」というエラーになってしまいます。 INNER JOIN内のSQLにWhere条件は使えないのでしょうか??保存前は動くので不思議でなりません… お手数ですがどなたかご意見よろしくお願い致します。

  • このSQLのおかしい所は?

    DB2環境です。 SQLを組んでみたのですが、どこかおかしいようでうまく値が とれません。 どこが問題になっているか教えていただけませんか? SELECT * FROM TR0410 r410 INNER JOIN TR0400 r400 ON r410.BILLMNGNO=r400.BILLMNGNO AND r400.DELETEFLG=0 INNER JOIN MR0010 mr10 ON (SELECT r10.BUILDMNGNO FROM TR0010 r10 INNER JOIN TR0410 r410 ON r10.ONKEINO=r410.ONKEINO)=mr10.BUILDMNGNO AND mr10.DELETEFLG=0 INNER JOIN MB0010 mb10 ON (SELECT r10.BUILDMNGNO FROM TR0010 r10 INNER JOIN TR0410 r410 ON r10.ONKEINO=r410.ONKEINO)=mb10.BUILDMNGNO AND mb10.DELETEFLG=0 AND mb10.BUILDTNO=(SELECT MIN(BUILDTNO) FROM MB0010 b10EX WHERE b10EX.BUILDMNGNO=mb10.BUILDMNGNO) INNER JOIN TR0010 r10 ON r410.ONKEINO=r10.ONKEINO AND r410.ONKEISUB=r10.ONKEISUB AND r10.DELETEFLG=0 INNER JOIN TR0100 r100 ON r410.TNKEINO=r100.TNKEINO AND r410.TNKEISUB=r100.TNKEISUB AND r100.DELETEFLG=0 INNER JOIN TR0050 r50 ON r410.ONKEINO=r50.ONKEINO AND r410.ROOMCD=r50.ROOMCD AND r50.DELETEFLG=0 INNER JOIN MR0030 mr30a ON r10.ONCD=mr30a.RESTORINO AND mr30a.DELETEFLG=0 INNER JOIN MR0030 mr30b ON r100.TENANTCD=mr30b.RESTORINO AND mr30b.DELETEFLG=0 WHERE r410.DELETEFLG=0 AND r410.SKYOTKBN=2 AND mr10.TORITENPO=1

  • SQL文で作ったデータを使ったUPDATE

    環境はMySQL5.6です。 下記のテーブルccがあります。 【cc】 shisan  user 500  tanaka 1000  mikami 400   tanaka 1300  mikami SELECT Total, user FROM (SELECT SUM( cc.shisan ) AS Total, user FROM cc GROUP BY user) AS t1 とすることによりSQL上にt1テーブルを作ることが出来ます。 【t1】 Total  user 900  tanaka 2300  mikami 次に、このt1テーブルのTotalの数値を下記のmoney_tableにあるcash欄に挿入(UPDATE)したいと考えています。 【money_table】 cash  user 0   tanaka 0   mikami そこで下記のSQL文を作ったのですがエラーになります。 UPDATE money_table,cc SET money_table.cash=t1.Total FROM (SELECT Total, user FROM (SELECT SUM( cc.shisan ) AS Total, user FROM cc GROUP BY user) AS t1) WHERE money_table.user=t1.user どこがいけないのかご指導いただけませんでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • SQL文の書き方について

    SQL初心者です。 教えてください。 A表とB表があります。 A表の伝票Noの列の値とB表の伝票Noの列の値はイコールです。 判定はB表のある別のカラム(sample)と変数Zに格納されている値がイコールという 条件で合致するA表のデータを抽出したいです。 LEFT JOINもしくはINNER JOINなどを使って書けば良いのでしょうか? 例えば SELECT * from A表 INNERJOIN B表 on A表.伝票No = B表.伝票No where B表.sample = 変数Z などと書けば良いのでしょうか?