プロが教えるわが家の防犯対策術!

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

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

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

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

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

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

このQ&Aに関連する最新のQ&A

A 回答 (3件)

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'
って感じで。
    • good
    • 0
この回答へのお礼

解決しました、ありがとうございました。
自分で試したとき、副問い合わせも
試してみていたはずなのですが・・・、
何か記述を失敗していたみたいです。
ありがとうございました。

お礼日時:2004/10/07 15:39

こんにちは。



残念ながらORACLEでは、
UPDATE文でテーブルを複数指定できません・・・。

UPDATEをするテーブルが複数ならば、別々にやるしかないですね。

UPDATEするテーブルが1つで、項目に別テーブルの値を参照したい場合は、

SET ○○=(SELECT ×× FROM △△)

です・・・。
(^^ゞ
    • good
    • 1

1:具体的に、どんなエラーが出ますか?


2: WHEREがないけど???

この回答への補足

返答ありがとうございます。
1の質問に対してですが、
[ORA-00971 : SETキーワードがありません。]
というエラーが起きます。

あと、2の質問に対してですが、
WHERE句は特に必要ない気がするのですが、
必要なのでしょうか?。
当方にはちょっとわかりません。

以上、宜しく御願いいたします。

補足日時:2004/10/07 15:27
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/10/07 15:37

このQ&Aに関連する人気のQ&A

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

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

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

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

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

QSQL 複数テーブルのupdate

こんばんは。
複数テーブルの複数カラムを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ベストアンサー

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='山田';

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 = '□' )
じゃだめですか。

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

Q単一グループのグループ関数ではありません。

オラクル10を使っています。

select NAMAE max(TEN) from KYOUKA WHERE OK=1 and CLASS IS ('A', 'B', 'C');

で単一グループのグループ関数ではありません。
というエラーになります。

CLASS | OK | NAMAE | TEN |
--------------------------
A 1 a01 50
A 1 a02 60
B 1 b01 10
C 1 c01 70
C 0 c02 100

a02 60
b01 10
c01 70
という結果になってほしいです。

Aベストアンサー

SQLの根本的な文法が理解できていないのかと

GROUP BY 句について調べてみましょう

Q同一テーブルのデータを参照してUPDATE

同一テーブル内のデータを参照してのUPDATEを行いたいです。
データは以下のとおりです。

ID1,ID2,Value
1,1,在校生
1,2,10期生
2,1,在校生
2,2,11期生
3,1,在校生
3,2,12期生

そして、UPDATEしたいデータは
ID1が同一で、
ID2が2でValueが「10期生」の場合に
ID1が1のValueに「卒業生」と入れたいのです。

この場合に書くべきSQLはどう書けばいいでしょうか?

Aベストアンサー

これ、MySQL以外ではサブクエリでできるSQLがMySQLでできないからって質問ですよね?
(サブクエリを多用しなければならない設計の場合、MySQLはやりにくいと思います)
あと、「ID1が1のValueに「卒業生」と入れたいのです。 」は「ID2が1のValueに」ではないですか?
ID1は同一なはずなので。。。
まぁ、この解釈が多少間違っていても直せる範囲だと思います。

update student a, (select ID1 from student where ID2 = 2 and Value = '10期生') b
set a.Value = '卒業生'
where a.ID1 = b.ID1 and a.ID2 = 1

Q他のテーブルを参照した値はupdateでsetできない?

「テーブルの特定の項目を、別のテーブルを参照した値でupdateできない」問題で悩んでいます。

以下の2つのテーブルがある場合、

select * from TAB_A
COL001 COL002 COL003
------ ------ ------
00001 YYY DE
00002 YYY FG
00003 YYY HI

select * from TAB_B
COL001 COL002 COL003
------ ------ ------
00001 YYY ST
00002 YYY UV
00003 YYY WX

TAB_AのCOL01とCOL02 を条件に TAB_BのCOL03を検索して、TAB_AのCOL03を更新するために

update TAB_A set TAB_A.COL003 = (
select TAB_B.COL003
from TAB_A,TAB_B
where TAB_A.COL01 = TAB_B.COL01 and
TAB_A.COL02 = TAB_B.COL02 )

と、記述すると、

ORA-01427: 単一行副問合せにより2つ以上の行が返されます。
とのメッセージが表示される場合があります。
なにか良い解決策はあるでしょうか?

「SQLは、実はテーブルの特定の項目を、別のテーブルを参照した値でupdateできない」のだ、との噂も聞きますが....

なお、使用しているDBは Oracle10gです。

「テーブルの特定の項目を、別のテーブルを参照した値でupdateできない」問題で悩んでいます。

以下の2つのテーブルがある場合、

select * from TAB_A
COL001 COL002 COL003
------ ------ ------
00001 YYY DE
00002 YYY FG
00003 YYY HI

select * from TAB_B
COL001 COL002 COL003
------ ------ ------
00001 YYY ST
00002 YYY UV
00003 YYY WX

TAB_AのCOL01とCOL02 を条件に TAB_BのCOL03を検索して、TAB_AのCOL...続きを読む

Aベストアンサー

相関問い合わせでの更新は、UPDATE対象の表の更新レコードに対応する1件を返す副問い合わせ文を
書かないといけないのですが、副問い合わせ文の中で、更新表をFROMに書いてしまうと、更新表と
無関係の副問い合わせを行ってしまいます。

update TAB_A set TAB_A.COL003 = (
select TAB_B.COL003
from TAB_B /* <============================注目 */
where TAB_A.COL01 = TAB_B.COL01 and
TAB_A.COL02 = TAB_B.COL02 )

のようにすれば、問題なく動作するかと思いますよ。

QOracleで「文字が無効です」のエラーが出ます

Oracleで「文字が無効です」のエラーが出ます

JavaからOracleに接続して、SELECT文を発行していますが、何度試しても上記のエラーが出ます。
発行しているSELECT文を、SQLPlusから打ち込むとちゃんと実行できます。
何が悪いのか見当がつきません。
お知恵をお貸しください。
ちなみに、対象テーブルの項目はvarchar2とnumberだけの項目ばかりで、日本語は使ってません。
また、Oracle初心者です。

環境
端末:WindowsXP
Oracle:10g Express Edition ※文字コードはAL32UTF8
IDE:Eclipse3.5 ※設定-一般-ワークスペースのテキストファイルエンコードはUTF-8

Aベストアンサー

Java内で生成したSQL文を見ないとなんとも言えないけど。

Javaでリテラル吐き出して編集してますかね?
select UserID, UserName from mstUser where UserID = '001'; みたいな。
条件によって 001 の部分を変化させるような。


だったらJavaでシングルクォートを吐き出すところを二重にしてみるとどうかな?
ダブルクォートでは無いよ。二重に書くことでシングルクォート一個と解釈されればOKのはず。

そうしておかないとSQL文全体を文字列で扱うんだろうから、シングルクォートの対応が崩れる。

つくりとしては以下のように作成。
select UserID, UserName from mstUser where UserID = ''001''; みたいな。

SQL文を文字列変数に格納するんだろうから
'select UserID, UserName from mstUser where UserID = ''001'';'

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
指定の条件
)

Q関係演算子が無効です。

オラクルで作成しているのですが、関係演算子が無効です。と出ます。
どこを修正すればよいでしょうか

SELECT *
FROM 表,
(
SELECT col
FROM 表
WHERE col1,col2 >
)
WHERE col = MIN(col);

Aベストアンサー

No.1の補足にある
>col1もcol2も同じく小さければという条件
の意味が理解できませんでした。


どのようなデータから、どのような結果を取得したいのかを
具体的に書いてもらえればアドバイスできるかもしれません。

Qデータを削除しても表領域の使用率が減りません

いつもお世話になっております。

今使用している表領域の使用率が高くなってきたため、
不要なテーブルやデータを削除しました。

ですが、少ししか使用率が減らず困っています。

テーブルを削除した際にはPURGE RECYCLEBINで、BIN~のテーブルも
消しています。

何か他に原因があるのでしょうか?

Aベストアンサー

前の方のおっしゃるとおり、DELETEしただけでは領域は開放されません(ハイウォーターマークが下がらない)ので、以下を試してみてください。

1.該当テーブルの全件削除で良い場合
truncate テーブル名 drop storage;
を実行する。
これで領域も開放されます。(最後のところをreuse storageとすると領域保持する意味となる)

2.部分的にdeleteして、領域を開放したい場合
alter table テーブル名 enable row movement;
alter table テーブル名 shrink space cascade;
alter table テーブル名 disable row movement;
を実行する。
1行目は領域開放の前準備、3行目は1行目の変更を元に戻す意味。
2行目でcascadeしておくと、関連インデックスの領域も一緒に縮小してくれます。


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

人気Q&Aランキング