
Oracleを使用しているのですが
SQL文の書き方がわからなくて困っています。
A,Bという2つの表があります。
A
name | age | gender | hobby
--------------------------
tom | 15 | male | music
john | 23 | male | car
kate | 8 | female | tv
B
name | age | gender
----------------------
john | 23 | male
kate | 32 | female
A.name=B.name and A.age=B.age and A.gender=B.gender
以外のものをA表から削除したいと思っています。
この例で言うとA表からjohn以外のものを削除したいと
思っています。
複数の表を結合した条件でのDELETE文の書き方が
わからないため困っています。
ご教授ください。
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
こんにちわ。
Oracle8i (R8.1.7) でちょっと確認してみました。
以下、確認結果です。
SQL> select * from tableA;
NAME AGE GENDER HOBBY
-------- ---------- -------- --------
tom 15 male music
john 23 male car
kate 8 female tv
SQL> select * from tableB;
NAME AGE GENDER
-------- ---------- --------
john 23 male
kate 32 female
SQL> delete from tableA where (name, age) not in
(select name, age from tableB);
2行が削除されました。
SQL> select * from tableA;
NAME AGE GENDER HOBBY
-------- ---------- -------- --------
john 23 male car
早速のご回答ありがとうございます。
教えていただいたとおりで実行できました。
where (a,b) in ~という書き方を知りませんでした。
勉強になりました。
ありがとうございました。
No.2
- 回答日時:
こんにちわ。
#1 のmuyoshid です。
#1 の回答を補足します。
#1 のように、not in 演算子を使用すると、tableA, tableB 共に
Full table scan が行われます。
tableB のname, age 列に対して索引が定義されている場合は、以下のように
not exists 演算子を使う事で索引を使用した検索を行う事もできます。
場合によって使い分けて下さい。
※ table のアクセス方法については、SQL TRACE を採取するか、explain plan
で確認できます。
SQL> select * from tableA;
NAME AGE GENDER HOBBY
-------- ---------- -------- --------
tom 15 male music
john 23 male car
kate 8 female tv
SQL> select * from tableB;
NAME AGE GENDER
-------- ---------- --------
john 23 male
kate 32 female
SQL> delete from tableA where not exists
(select NULL from tableB where tableA.name = tableB.name
and tableA.age = tableB.age);
2行が削除されました。
SQL> select * from tableA;
NAME AGE GENDER HOBBY
-------- ---------- -------- --------
john 23 male car
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) パイソン初心者です 4 2022/06/29 06:49
- JavaScript Json のキーと値の出力の違いについて 2 2022/06/14 20:22
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- その他(プログラミング・Web制作) Rでのスクリプトのご相談 3 2022/12/08 16:22
- 英語 【大至急】Hellotalk公式からメールの返信が来ました 1 2022/04/18 17:53
- JavaScript 変数宣言と初期値代入の場所について 3 2022/10/31 19:09
- 英語 提示した結果構文が非文となる理由について 1 2022/07/25 12:22
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Oracleの監視。
-
クライアントからのDBアクセス
-
GROUP BYを行った後に結合した...
-
SQLでの絞り込み検索
-
Oracleでの文字列連結サイズの上限
-
Access2000データベースのロッ...
-
決定性有限オートマトン
-
日本語の表名、列名の利用について
-
sqlplusの処理が途中でとまる
-
サブフォームに新規レコードを...
-
Accessで別テーブルの値をフォ...
-
DataGridViewの内容をDBに反映...
-
INNER JOINの有用性
-
実績累計の求め方と意味を教え...
-
固有レコード識別子の選択とは
-
select insertで複数テーブルか...
-
ADO VBA 実行時エラー3021
-
NULLのみを保持した列を除外し...
-
OracleのSQL*PLUSで、デー...
-
Excelで、改行がある場合の条件...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL文で右から1文字だけ削除す...
-
使うべきでない文字。
-
sum()の出力結果順に並び替えを...
-
割合(パーセント)を求めるに...
-
【初歩】ラジオボタンをつかっ...
-
MySQLで MAX()とGROUP BYを使う...
-
【MYSQL】asでリネームしてwher...
-
チェックボックスの項目をDBにi...
-
SQLの集計で「全て」の合計も表...
-
カウント結果を1レコードの中...
-
表示幅を短くしたい
-
重複が
-
月別、販売員別の集計がわかり...
-
何にかが違うから エラーなんで...
-
SQLでデータを整形して取得可能...
-
1つのテーブルから複数のテーブ...
-
MySQL のデータからドロップダ...
-
Oracleの監視。
-
抽出時のことで質問です
-
JOINでの結果取得 サブクエリ...
おすすめ情報