これからの季節に親子でハイキング! >>

お世話になります、
Oracleで、delete文で困っています。

関係しあう二つのテーブルtab1,tab2があります。

二つのテーブルから同時に関係する項目を削除する
場合、同時に両方のテーブルの関係する項目を削除する場合どのような文になるのでしょうか、

delete from で複数のテーブルをしてすることはできないし、

delete from (select * from tab1,tab2)というような感じでデリートしても、片方のテーブルしかデリートされません。

よろしくお願いします。

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

A 回答 (2件)

結合VIEWで定義しておけば消せると思います。


詳しくはORACLEのマニュアルORACLE概要をご覧ください。

#バージョンに依存する機能もあるので質問の際にはバージョンも明記した方が良いと思いますよ。
    • good
    • 0

「制約」があるテーブル、という意味ではないんですね?



ならばあらかじめ削除対象を別テーブルに抽出しておいて、
その後にDELETE文を2本実行ではどうでしょうか?

この回答への補足

削除条件を抽出しておいて、
それを使ってデリート文を2本実行するしかないでしょうか…

手間がかかりますね、
ありがとうございました。

補足日時:2001/08/17 21:17
    • good
    • 0

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

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

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

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

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

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

Q特定のスキーマのテーブルを一括削除したい

おせわになります、

Oracleのデータベースで
特定のスキーマのテーブルを一括削除したい時の
コマンドを探しているのですが、

ひとつずつ消すのは面倒なので、一括で消したいとかんがえております。

よろしくお願いします。

Aベストアンサー

ユーザを削除する時に、同時にスキーマ内のオブジェクトを一緒に削除するという方法では駄目でしょうか?(削除後ユーザを再作成する)
この方法だと、テーブル以外のオブジェクトも削除されてしまいますが・・・。

以下の方法でユーザを削除できます(システム権限が必要です)
DROP USER ユーザ名 CASCADE;


それか、以下のSQL*PLUS、SQLコマンドをSPOOLして実行し、SPOOLされた結果を再度実行するという方法は?
SET PAGES 0
SPOOL 任意のファイル名.SQL
SELECT 'DROP TABLE '||TABLE_NAME||';' FROM USER_TABLES;
SPOOL OFF
@任意のファイル名.SQL

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異なるテーブルのレコード削除

オラクル初心者です。宜しくお願いします。
AAA、BBB、CCCというテーブルがあると仮定します。
画面から入力された値(ddd)をキーとして、CCCテーブルから該当するレコードをセレクト文で引っ張り、eeeという値を抜き出したとします。
そのeeeという値をキーにAAA、BBBテーブルのレコードを削除するにはどういうSQLを発行すればよろしいでしょうか?
"delete from
AAA, BBB
where eee =
(select eee from CCC where fff = ddd);"
では駄目でした。
質問が下手でわかりにくいかもしれませんが、どうかご教授お願いします。

Aベストアンサー

DELETE文1文では、1つのテーブルに対してしか操作できませんので、
DELETE文を2つ投入するか、PL/SQLブロックとして投入するかいずれかに
なります。
(無名PL/SQLが投入できるミドルウエアと投入できないミドルウエアがあります)

Qimportについて

こんばんは。

exportしたダンプファイルを頂いたので
oracleにimportしようと思っています。
色々調べて以下のようにわかったのですが、
間違っていないか、パラメータで追加した方が
よいものがあれば、ご指摘お願いします。

1)
既に同じ内容のテーブルが存在するが、それは気にせずimportを行う。既存のテーブルデータは新しくimportするもので更新されている???

2)
SQL*PLUSでコマンドを叩く。
コマンド内容は以下の通り。
imp system/manager fromuser=test1 touser=test2 file=db_data.dmp log=implog.log

test1 ← DBA権限あり。
test2 ← このユーザーの表領域にデータを作成したい。

Aベストアンサー

>上記オプションで、既存のテーブルは古いデータが削除され、

ignore=yにしてもimpコマンドではデータの削除は行われません。
一意制約違反となります。
あらかじめ不要なデータは消しておきましょう。

truncate table テーブル名;
でデータを切り捨てるのがいいかと。


>新規に増えたテーブルは
>新規に作成(データ込み)と考えて正しいでしょうか?

はい。こちらはこうです。

Qスキーマの削除、スキーマオブジェクトの全削除どちらがよいですか

Oracleの1スキーマの全データの入れ替えを
exp、impコマンドを使って行いたいと思っております。

その場合
1)スキーマを削除してからスキーマの再作成をしてインポート
2)スキーマ内のオブジェクトを全部削除してインポート

1と2どちらの方がよいでしょうか。
私は、1の場合、ログインしている人がいると削除できないので、
2で行おうと思っております。(テーブルにはpurgeオプションをつけて・・・)

みなさんならどちらで行いますか。
メリット・デメリットありましたら
教えていただけると助かります。

Aベストアンサー

>1)スキーマを削除してからスキーマの再作成をしてインポート

この場合、削除したスキーマに対して与えられた権限も消えます。
スキーマを再作成して、権限を与えるのはモレがある可能性があります。すべてのロール、システム権限、オブジェクト権限を戻せるだけの準備が可能なら問題ないですが。

GRANTOR(権限付与を実行したユーザー名)だったら良いのですが、
GRANTEE(アクセス権を付与されたユーザー名)だったら、ユーザモードのexp/impだと、付与された権限は戻せないです。
※ユーザモードのexpファイルにはgrantした権限の「grant文」しか載りません。

以下のディクショナリから情報を抜き出しておいて前後で比較する必要があります。
xxx_sys_privs
xxx_role_privs
xxx_tab_privs

あるいは考慮しなくてもよい要件なのでしょうか。

>2)スキーマ内のオブジェクトを全部削除してインポート
スキーマ単位で考慮すべきことを考えなくてもよいので、こっちのほうが妥当かと思います。

>1)スキーマを削除してからスキーマの再作成をしてインポート

この場合、削除したスキーマに対して与えられた権限も消えます。
スキーマを再作成して、権限を与えるのはモレがある可能性があります。すべてのロール、システム権限、オブジェクト権限を戻せるだけの準備が可能なら問題ないですが。

GRANTOR(権限付与を実行したユーザー名)だったら良いのですが、
GRANTEE(アクセス権を付与されたユーザー名)だったら、ユーザモードのexp/impだと、付与された権限は戻せないです。
※ユーザモードのexpファ...続きを読む

Qtruncate文で全テーブルを一気に削除できるか?

さきほどと似たような質問ですみません。

SQLコマンドであるデータベースの全テーブルを削除したいんですが、
truncate一文ですませる方法はないでしょうか。

それとも、一行ずつ
truncate tableA
truncate tableB
....


とやっていくしかないのでしょうか?

Aベストアンサー

declare
CURSOR CUR1 IS SELECT * FROM USER_TABLES;
begin
FOR CUR_RECORD IN CUR1 LOOP
EXECUTE IMMEDIATE 'TRUNCATE TABLE "'||CUR_RECORD.TABLE_NAME||'"';
END LOOP;
end;
exit
/
というPL/SQLスクリプトを投入すれば、自己所有のテーブルは空に出来ます。
有無を言わさずに空になるので、気を付けてくださいね。

Q複数テーブルの削除

お世話になります。
うまい資料が見つからなかったので質問させてください。

例えば、下記のようなテーブルが3つあったとします。

<table1>
id
name
date

<table2>
id
tel

<table3>
id
etc

name,date,tel,etcは同タイミングで一括に登録され、3テーブルともに共通のidで保存されます。
この時、table1のdate(日付が入ります)が30日以上経過しているデータについて、いずれのテーブルからも削除したいと思っています。
こんな場合、どんなSQL文を書けば良いのでしょうか?

お分かりになる方、何卒よろしくお願いしますm(_ _)m

Aベストアンサー

RDBMSは、ここのカテゴリ通りMySQLですか?
バージョンは?

MySQLなら、独自機能で複数表の削除が可能です。
MySQLでないなら、同じトランザクション内でそれぞれの表から削除するとか、トリガを利用するといった方法が考えられます。

MySQLの場合の例です。

delete tbl1,tbl2,tbl3 from tbl1,tbl2,tbl3
where tbl1.id=tbl2.id and tbl2.id=tbl3.id
and tbl1.`date`<date('2008-02-28')-interval 1 month

今日の日付を自動的に拾うには、curdate関数やcurrent_date関数を使う方法があります。

<マニュアル参照先>
http://dev.mysql.com/doc/refman/4.1/ja/delete.html
http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.html

QOracleで上書きImportはできますか?

DBサーバーA(以下A)のデータを毎月Exportし、DBサーバーB(以下B)にImportしていきます。
二回目以降は先月のImportでBにはAと同じテーブル定義がされています。
二回目以降にBの定義(データも含め)を削除せずにAのデータを追加及び上書きしたいのですが増分Expなどで出来るのでしょうか?
Oracleのバージョンは8.0.5.2.1です。
宜しくお願いします。

Aベストアンサー

importとSQLだけでできる方法です

1.サーバBのテーブル名を変更(たとえばTEMP_TABLE)する
2.サーバAの内容をサーバBにimportする
3.TEMP_TABLEの内容のうち、importした内容とキー重複となるレコードを相関副問い合わせのDELETE文で削除する。
4.TEMP_TABLEの内容をimportしたテーブルにinsertする
5.TEMP_TABLEをdropする

削除でロールバックセグメントがパンクしない量であればお勧めです。

Q既にテーブルが存在する場合のインポート

インポート対象のテーブルが既に存在する場合、次のエラーが発生します。

IMP-00015: オブジェクトがすでに存在するため次の文は失敗しました:
"CREATE TABLE ...

SQL Loaderではデータにスペースや改行が含まれているとdatの作成がめんどうですし、dmpファイルでcreate文を削除するようなこともできればしたくありません。

データを追記したいのでテーブルを削除せずにインポートしたいのですが、どうすればよいでしょうか?

Aベストアンサー

参考URLの内容はどうでしょうか?

参考URL:http://www2.odn.ne.jp/~cag07740/tech_info/oracle_ans7.html

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ランキング