人に聞けない痔の悩み、これでスッキリ >>

こんばんは。
複数テーブルの複数カラムをupdateしたいのですが、
うまくいかず困っています。
どなたか助けてください>_<

テーブルA(tableA)のoptionAというカラムと、
テーブルB(tableB)のoptionBというカラムを両方更新したいんです。

やりたい内容のイメージとしてはこんな感じです↓
update tableA a, tableB b
set a.optionA='OK', b.optionB='OK'
where a.student_id=b.student_id and a.name='山田';

どなたかご指導お願いいたします。

A 回答 (3件)

where条件に別テーブルの結合を必要とするので、同時に更新したい・・・


ということならば、以下のようなupdate文を2回発行ではだめなんでしょうか?

update tableB b
set b.optionB='OK'
where exists(
select * from tableA a
where a.student_id=b.student_id and a.name='山田'
);

update tableA a
set a.optionA='OK'
where a.name='山田';
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
”山田”という条件も固定ではなく違うDBから取得したいと考えていたので、
どうにか1つにならないかなぁっと考えていました。
でもやはり2つに分ける方がわかりやすですね。。
ありがとうございます☆

お礼日時:2009/12/23 00:26

1回のUPDATE文で複数テーブルの更新はできません。



質問の目的によりますが、
2回UPDATEしたくない事情としては、
アプリケーションからDBMSへの通信をどうしても1回にしたい、というためでしょうか?

であれば、2テーブルを更新するようなPROCEDUREを作成し、それをコールするようにすれば、「アプリケーションからDBMSへ1回の通信で複数テーブルを更新する」ということは実現できます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
2回UPDATEしたくない理由はいくつかあるのですが
おっしゃるとおり、通信を1回にしたいというのもその一つです。

PROCEDUREというのは始めて聞きました!
調べてつかえるようにしてみます。

ありがとうございます☆

お礼日時:2009/12/23 00:28

1つのUPDATE文で2つの表を同時に更新することはできないと思いますよ。



更新可能ビューを使えばできそうに思えますが、

「ORA-01776: 結合ビューを介して複数の実表を変更できません。」

というエラーになります。

マニュアルにも、

「結合ビューに対するINSERT、UPDATEまたはDELETE操作は、基礎となる実表を一度に1つしか変更できません。」

と記載されています。

http://otndnld.oracle.co.jp/document/products/or …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
マニュアル読みました。
やはり2つ同時は厳しいんですね。
別々で実行してみます☆

お礼日時:2009/12/23 00:23

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

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QUPDATE文のWHERE条件に他のテーブルのフィールドも入れたい

SQL文についてです。

表Aで列1と列2が'◎'のものについて、列3,列4,列5をそれぞれ'○','△','×'に更新したい場合は下記でOKだと思います。
UPDATE 表A
SET 列3 = '○', 列4 = '△', 列5 = '×'
WHERE 列1 = '◎' AND 列2 = '◎'

列1と列2をキーとして表Aと結合できる表Bが存在するとします。
条件に表Bの列6が'□'だった場合を追加したい時、どのような方法で行えば良いのでしょうか?
内部結合やWHERE EXISTSなどをいろいろ調べたのですが、SQL文に慣れていないためかうまくいきません。
初歩的な質問で申し訳ありませんが過去質問で参考になるものがなかったのでお願いします。

Aベストアンサー

UPDATE 表A
SET 列3 = '○', 列4 = '△', 列5 = '×'
WHERE 列1 = '◎' AND 列2 = '◎'
AND EXISTS
( SELECT 1 FROM 表B
WHERE 表B.列1 = 表A.列1
AND 表B.列2 = 表A.列2
AND 表B.列6 = '□' )
じゃだめですか。

QSQLで複数のテーブルと結合したUPDATE文

普通のUPDATE文はUPDATEするテーブル名を一つ記入して
UPDATE テーブルA SET フィールドA = 値A WHERE テーブルA.フィールドB = 値B
みたいな感じですが、私のしたい事はと言うと
UPDATE テーブルA,テーブルB,テーブルC
SET A.フィールドA = 値A
WHERE テーブルA.フィールドA = テーブルB.フィールドB
AND テーブルB.フィールドB = テーブルC.フィールドC
AND テーブルB.フィールドD = 値D
AND テーブルC.フィールドE = 値E
という具合に複数のテーブルがUPDATEするテーブルA以外のところで、互いに条件で結ばれており、FROM句でUPDATEしないテーブル名まで宣言しないといけなくなっています。そもそもこういうFROM句を使うUPDATE文は実行可能かも不明です。どなたか解決策お願いいたします。ちなみに開発ソフトはVBAを使っています。

Aベストアンサー

SET句にもサブクエリを使えますよ。

UPDATE テーブルA
SET フィールドA = ( SELECT テーブルB.フィールドF
FROM テーブルB,テーブルC
WHERE テーブルB.フィールドB = テーブルC.フィールドC
AND テーブルB.フィールドD = 値D
AND テーブルC.フィールドE = 値E )
WHERE フィールドA = ( SELECT テーブルB.フィールドB
FROM テーブルB,テーブルC
WHERE テーブルB.フィールドB = テーブルC.フィールドC
AND テーブルB.フィールドD = 値D
AND テーブルC.フィールドE = 値E )

> VBAと言うと普通ACCESSですよね?
VBAからODBC経由でOracleやSQL Serverという例もあるので
一概にはAccessのみとはいえません。

Q複数テーブルのUPDATE

タイトルの通り、複数テーブルのUPDATEを行いたいと思っています。
私なりには、以下のようなコードでテーブルを作成しようとしましたが、作成できませんでした。 エラー内容としては、
update table_1, table_2 SET
のtable_1, が間違ってます的なエラーでした。

update table_1, table_2 SET
table_1.updatetime=getdate(),
WHERE
table_1.SeqNo = table_2.SeqNo
AND table_1.SeqNo = @SeqNo

以上、緊急の内容であったため、十分調べていない点があるかもしれませんが、何卒、ご存知の方ご教授お願い致します。

Aベストアンサー

update1文で複数表の更新は、SQL Serverでは未サポートです。
MySQLでは、サポートしているようですけど。

質問にあるupdateは、table_1だけ更新するようになっているようですが、table_2の更新部分を省略して書いただけでしょうか?

updateで他表とジョインした結果で1表を更新するといった書き方なら、「update ~ set ~ from ~ where ~」といった書き方はできます。

Q1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

Delphi2010+SQL SERVER 2005で開発しています。

update文で、
現在下のようにwhileで複数レコードに対して、
1回、1回、sqlを発行して、更新しています。
これを、一度のSQLの発行で処理できないものでしょうか?
更新テーブルは1つで、更新する項目も同じです。
更新するデータと、where句の条件が異なります。

もし可能なようでしたら、どうかご教授お願いします。

update table set A=1,B=2 where id=1
update table set A=2,B=3 where id=5
update table set A=9,B=99 where id=7
update table set A=5,B=10 where id=15
update table set A=1,B=10 where id=75

Aベストアンサー

ですか・・・。
じゃあWhileで発行するのをやめたらどうですか?

BEGIN TRAN
update table set A=1,B=2 where id=1;
update table set A=2,B=3 where id=5;
update table set A=9,B=99 where id=7;
update table set A=5,B=10 where id=15;
update table set A=1,B=10 where id=75;
COMMIT

まとめて実行・・・。

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

QSQL、2つのテーブルで条件一致したものだけdeleteする方法は?

オラクルSQLで質問です

やりたいことは、
テーブルAから以下の条件に該当するデータを削除する。
基本的にはテーブルBの内容と比較して、一致したもの。

条件(全ての条件を満たすこと)
 テーブルA.AAA = テーブルB.AAA
 テーブルA.BBB = テーブルB.BBB
 テーブルB.CCC > 0


調べたところ、SQLサーバでは以下のように
from を2つ書いて実現できるようです。
が、今回はオラクルなので文法エラーになります。

delete FROM テーブルA FROM テーブルB
where
テーブルA.AAA = テーブルB.AAA
AND
テーブルA.BBB = テーブルB.BBB
AND
テーブルA.CCC > 0
;
commit;


よろしくお願いします

Aベストアンサー

delete 文の細かい構文はちょっと覚えてませんが
サブクエリ使えばいいんじゃないですか

delete from table_a
where 主キーカラム = (
select table_a.主キーカラム
from table_a, table_b
where
指定の条件
)

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

QオラクルのUPDATEで複数テーブル

見ていただいてありがとうございます。

どなたか、方法がお分かりになる方、
ご教授いただけるよう宜しく御願いいたします。

ORACLEのSQL_PLUSを使用して以下のような
SQLを実行するとエラーとなります。

UPDATE テーブル名1 , テーブル名2
SET
テーブル名1.項目A = '2' ,
テーブル名1.項目B = '02' ,
テーブル名1.項目C = テーブル名2.項目A

当方、ACCESSとSQLサーバーでSQLの経験が若干あり、
そちらではこの記述方法で正常実行されるのですが、
オラクルでの記述方法がよくわかりません。
ネット等を利用し調べたのですが、打開策が見つからず、質問させていただこうと思った次第です。

どうか宜しく御願いいたします。

Aベストアンサー

update table1 set A = '2',B = '02'
C = (select A from table2 )

where節は適宜つけて下さい。
例えば
update table1 set A = '2',B = '02'
C = (select A from table2 where A = '3')
where B = '01'
って感じで。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング