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

このQ&Aのポイント
  • AテーブルとBテーブルをINNER JOINしてSELECTした結果を使ってUPDATEする方法を教えてください。
  • 指定の条件に合致するレコードの特定の項目を、別のテーブルの同じ項目で更新する方法を教えてください。
  • AテーブルとBテーブルを結合し、特定の条件に該当するレコードの項目を更新する方法を教えてください。
回答を見る
  • ベストアンサー

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 = '失効中止'))

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

  • ベストアンサー
回答No.1

SQL Server 2005 という前提で回答します。 SelectによるUpdateの場合は、SETする内容が更新テーブルに対して確実に1つの結果でなければエラーとなります。 つまり、 Update TableA Set ColumnA = ( select 'a' from TableB ) (複数行帰る) ような書き方はできません。 上記のクエリの TableB が1レコードのみの場合、 TableAのColumnA列に全て 'a' という文字が入ります。   したがって、 ( select top 1 'a' from TableB ) で結果行が1レコードとなり更新可能かと思います。 ちなみに、BテーブルのCodeが同じであればPointZanは全て同じ値がはいるのでしょうか?それとも、主キーであり常に1レコードのはずなのにエラーとなっている? -----------------代替案------------------- または、質問者様のクエリはどうも構文のエラーのような気がします。 AテーブルのPointZan 列を、BテーブルのPointZan と同じ値にUpdateしたいということでしょうか? でしたら、 update A set A.PointZan = B.PointZan from A inner join B on B.Code = A.Code where (B.TrDate = '091012') AND (B.Comment = '失効中止') こちらで更新可能かと。

関連するQ&A

  • 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

  • この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

  • SELECTのスピード

    SELECTのスピードでどの方法が 検索スピードが速いのか教えてもらいたいのですが Aのテーブル DENNO CODE Bのテーブル CODE NAME Aのテーブルを主にAのCODEでBのテーブルを参照したい時 (1) SELECT A.DENNO,A.CODE, (SELECT B.NAME from B where A.CODE=B.CODE) AS NAME from A (2) SELECT A.DENNO,A.CODE,B.NAME FROM A LEFT JOIN B ON A.CODE=B.CODE (3) SELECT A.DENNO,A.CODE,B.NAME FROM A , B WHERE A.CODE=B.CODE(+)

  • ちょっと見かけないinner joinについて

    どなたか以下の構文について教えて下さい。 どこのDBMSで使用されるものなのでしょう? SELECT B.項目1, B.項目2, A.項目2, A.項目3 FROM ( ( SELECT * FROM Bテーブル WHERE 項目3>"1" ) B INNER JOIN ( SELECT * FROM Aテーブル WHERE 項目2=10 ) A ON B.項目1=A.項目1; 意味はわかるのですが、普通のinner joinとは違うもので。

  • SQLについて

    以下のSQLを実行すると。 SQL実行中に以下のエラーが発生しました。 エラーコード:907 [Oracle][ODBC][Ora]ORA-00907: 右カッコがありません。 というエラーが表示されます。 どこがおかしいでしょうか? SELECT Q1.Pコード, Q1.Qコード, T1.E名称 A名称, T2.E名称 B名称, T3.E名称 C名称, T4.E名称 D名称, FROM ( ( ( ( SELECT Pコード, Qコード, Aコード, Bコード, Cコード, Dコード, FROM 報告書 WHERE Pコード = '0001' AND Qコード = '0001' AND ) Q1 INNER JOIN Eマスタ T1 ON Q1.Aコード = T1.Eコード ) INNER JOIN Eマスタ T2 ON Q1.Bコード = T2.Eコード ) INNER JOIN Eマスタ T3 ON Q1.Cコード = T3.Eコード ) INNER JOIN Eマスタ T4 ON Q1.Dコード = T4.Eコード ORDER BY Pコード, Qコード;

  • oracleでwith句の結果を使ってupdate

    oracleでwith句の結果を使って外部結合?でupdateしたいのですが 上手くいきません。 oracleでは無理なのでしょうか。 よろしくお願いいたします、。 /*---------- with v1 as ( select row_number() over(PARTITION BY ・・・ ORDER BY ・・・) as rnum ,no ,col1 ,・・・ from ・・・ ) update ( select A.col1 A_COL, v1.col2 B_COL from table1 A inner join table2 B on A.cd1=B.cd1 inner join v1 on A.no=v1.no where v1.rnum=1 and ・・・ ) set A_COL=B_COL ; ----------*/ と書いたのですが、 実際に実行してみると、 カッコ「(」、「)」がないとか、 selectが必要とか, A_COLやB_COLが無効ですとか、 となります。 どこが悪いのでしょうか。 oracleではupdateでwithは使えないのでしょうか。 よろしくお願いします。

  • Update文について

    UPDATEについて SELECT * FROM A_table A JOIN B_table B ON (A.code = B.code) 上のように2つのテーブルをJOINして、 AのフィールドB.dateフィールドに A.dateフィールドを代入したいのですが、 どのようなUPDATE文を書けばよろしいでしょうか?

  • 結合が上手くいきません

    以下のテーブルがあるとします table1 名前|住所コード|勤務地コード table2 コード|名称 テーブル1の検索結果にテーブル2の名称を引っ張ってきて取得したいのですがどうやるのでしょうか? SELECT * from table1 INNER JOIN table1.住所コード ON table2.コード INNER JOIN table1.勤務地コード ON table2.コード これではうまくいきませんでした。 SELECT (select 名称 from table2 where table2.コード=table1.住所コード),(select 名称 from table2 where table2.コード=table1.勤務地コード) FROM table1 これは上手くいくのですが重いらしいので、、、

    • ベストアンサー
    • MySQL
  • select for updateのロック

    オラクルのselect for updateでロックをするタイミングがいつですか? こんなPL/SQLのコードがあったとします。 ---↓↓↓ソースコードここから↓↓↓------------------------- select * from テーブル1 where id = 1 for update; ・・・・・(a) ~ update テーブル1 set kingaku=100 where id = 1 ・・・・・(b) ~ commit; ---↑↑↑ソースコードここまで↑↑↑------------------------- id = 1のレコードがロックされるのは(a)、(b)どちらのタイミングですか? また、このロックは ・他トランザクションから読めるけど更新できない ・他トランザクションからは読むことすらできない のどちらでしょうか? よろしくお願いします。

  • SQL詳しい方、助けてください。

    こんにちは。 UPDATE テーブルA SET フィールドA1 = '1' WHERE フィールドA2 =(SELECT フィールドB1 FROM テーブルB WHERE フィールドB2 = 'C0' OR フィールドB2 = 'C2' AND フィールドB3='') AND フィールドA3 = '' AND フィールドA4 <> '' というSQLを作成して、動作していたので安心していたら、 テーブルBのレコード数は1件のみだと思っていたら、複数存在する場合があるとのことで、 テーブルBのレコードを追加してみたところ、、 【サブクエリは複数の値を返しました。サブクエリが = 、!= 、<、<= 、>、>= のあとに続く場合や、 サブクエリが 1 つの式として使われる場合に複数の値は許可されません。】 というエラーで終了するようになってしまいました。 そこで、 UPDATE テーブルA AS A INNER JOIN テーブルB AS B ON A.フィールドA2 = B.フィールドB1 SET A.フィールドA1 ='1' WHERE B.フィールドB2 = 'C0' OR B.フィールドB2 = 'C2' AND B.フィールドB3='' AND A.フィールドA3='' AND A.フィールドA4 <> '' としてみました。 なんだか混乱してきて、結合条件があっているかが 自分でもよくわかんなくなっていますが。 しかも、 上記のSQLをSQL SERVER 2000のクエリアナライザで 実行すると、 【キーワード 'inner' 付近に正しくない構文があります。】 というエラーが・・・。 INNER 以下はいろいろおかしいんだろうな・・・と 思っていたのですが、まさか、そんなしょっぱなで引っかかるとは思いませんでした。 いろいろ、記述方法を変更してみたり、考えたんり したんですけど、情けないことにさっぱり解りません。 どなたかお力をお貸しください。 お願いします。

専門家に質問してみよう