• 締切済み

テーブルの行を動的なキーをもとに削除したい

基本的な質問でしたら恐縮です。 Oracle 11gデータベースを使用しています。あるテーブルから、特定のキーを削除するSQL文は書けます。例えば、USER_IDが0020、0019の二行を削除したい場合以下のようにすると思います。 DELETE FROM USER_MASTER WHERE USER_ID IN ('0020', '0019'); 今やりたいのは、このキーを他のCSVファイルなどに記述させ、(例. 0020, 0019, 0037, ...)この値をバッチファイルから読み込んで削除するようにしたいです。そうすれば、日次でCSVを更新すれば毎日別の行を削除でき汎用的にできるからです。CSVに記述する値の数は可変としたいのですが、このように動的に処理することは可能でしょうか? 普通のSQLではなく何等かのプログラムが必要かと思いますが、これがPL/SQLというものでしょうか? もし、簡単にPL/SQLで作成できるようなものであれば、どなたかご提示頂けないでしょうか。あと、バッチファイル(WindowsでもUNIX版でも)からそれを呼び出すところまでご教示頂けるのなら大変助かります。 以上、宜しくお願いします。

  • Oracle
  • 回答数1
  • ありがとう数1

みんなの回答

  • y_shimizu
  • ベストアンサー率41% (27/65)
回答No.1

DBがあるサーバもしくは接続可能なクライアントからの実行が前提ですが、 CSVに対象が記載され、変な話そのままINに入れてクエリを投げたいだけ、 かつ、バッチやシェルが使える、というのであれば、 PL/SQLなんて大げさなことは要らないと思います。 バッチorシェルで CSVから1行まるごと読み込む DELETE文に加工して別ファイルに出力 SQLPlusでDB接続 STARTコマンドで外部ファイルのクエリ実行 コミット DB接続を切断 終了 でいける気がします。

関連するQ&A

  • 一度に関連する他のテーブルの行も取得したい

    MySQLバージョン4.1.16を使用しています。 ちょっとPHPも絡んでくるのですが、こちらのジャンルでお願いします。 テーブル「items」はテーブル「users」のuser_idカラムを 外部キーとして持っています。ここで「users」テーブルの行を取得して、 その値(user_idのaaaaやbbbbなど)を利用して 「items」テーブルのそれぞれ対応する行を取得したいのですが、 $users = (usersテーブルの行を取得するSQL文); $index = 0; foreach ($users as $row) { $users[$index]['items'] = (user_idに対応したitemsテーブルの行を取得するSQL文); $index++; } print_r($users); /* Array (  [0] => Array   (    [user_id] => aaaa    [items] => Array     (      [0] => Array       (        [user_id] => aaaa        [item_name] => アイテム1       )      [1] => Array       (        [user_id] => aaaa        [item_name] => アイテム2       )     )   )  [1] => Array   (    [user_id] => bbbb    [items] => Array     (      [0] => Array       (        [user_id] => bbbb        [item_name] => アイテム3       )     )   ) ) */ と、このように2段階に分けてやれば取得できるのですが、 そうではなくてこれを一度に取得できるSQL文というかやり方はあるのでしょうか? $users = (usersテーブルの行を取得するSQL文);←この段階でそれぞれ対応してるitemsテーブルの行まで取得したい

  • CSVファイルの項目行を削除して結合するには?

    お世話になります。m(__)m 2000行ほどのCSVファイルが数個あります。 このCSVデータをすべてひとつのファイルに結合したいのですが、 ・それぞれのファイルの1行目にある項目データを削除したい。 ・結合後の1行目には項目名を残したい。 ・可能であればコピーバッチのようなもので作成したい。 と、このように思っております。 どのような手があるか教えて下さい。

  • Windowsバッチで「,,,,,,,,,,」削除

    CSVファイルがあります。Windowsバッチを使って、 CSVファイルの中に「,,,,,,,,,,」という行があったら この行を削除して上書き or 別名で保存したいのですが、 どのようなコードになりますか? for でdelimsなしで1行ずつ読み込み、 「=,,,,,,,,,,」で処理を分岐させようとしたら うまくいきませんでした。

  • 共通のカラムを持つテーブルの外部キーの設定

    MySQLバージョン4.1.16を使用しています。 2つのテーブル「tbl1」と「tbl2」があり、 それぞれ共通のカラムを別のテーブル「common_tbl」に設定(正規化)し そのcommon_idを「tbl1」と「tbl2」が参照します。 例えば、「tbl2」にデータをinsertする場合に、 まず「common_tbl」からinsertして、そのinsert_idを取得(利用)して 「tbl2」にデータを挿入します。 たぶんこの場合のinsertはこのようなやり方だと思います(あまり自信ないなぁ・・・) 「tbl2」の行を削除した場合に、「common_tbl」の行も自動で削除させたいと思うのですが、 どのように外部キーを設定するのか(どこに設定するのか)が分かりません。 「common_tbl」に「tbl1」のtbl1_idと「tbl2」のtbl2_idを それぞれ持たせるのはたぶん違うと思いますし・・・ この場合の正しいテーブル構成を含めてアドバイスをお願いしたいです。 例: 「tbl2」のtbl2_idが2の行を削除したら、 「common_tbl」のcommon_idが3の行も削除したい(外部キーで自動的に) テーブル「tbl1」 +------+---------+----------+ | tbl1_id| tbl1_col1 |common_id | +------+---------+----------+ |  1  |   値1  |   1    | +------+---------+----------+ テーブル「tbl2」 +------+---------+----------+----------+ | tbl2_id| tbl2_col1 | tbl2_col2 |common_id | +------+---------+----------+----------+ |  1  |   値1  |   値1  |    2   | +------+---------+----------+----------+ |  2  |   値2  |   値2  |    3   | +------+---------+----------+----------+ テーブル「common_tbl」 +----------+---------+----------+ |common_id |   col1  |   col2  | +----------+---------+----------+ |  1     |   値1  |   値1  | +----------+---------+----------+ |  2     |   値2  |   値2  | +----------+---------+----------+ |  3     |   値3  |   値3  | +----------+---------+----------+

    • ベストアンサー
    • MySQL
  • スタートアップのファイルをバッチで削除

    windows2008のターミナルサービスでスタートアップにバッチファイルを設置していますが、 初回起動のみを動作させるために、 バッチ内にバッチファイルを削除する記述をしていますが、 動作ディレクトリがc:\windows\system32なので、 スタートアップのファイルは削除できません。 スタートアップのファイルをバッチで削除する方法はあるのでしょうか? またスタートアップのディレクトリ名の中に ユーザー名が含まれているのですが、 バッチファイル内に記述するのに、 これを別称などで、どのユーザーでも反応するように、する記述方法はあるのでしょうか?

  • TABLE内の行をランダムに半減させたい。

    あるテーブル(table)の行をランダムに半減させたいと思っています。 このテーブルのキーは、instance_idとuser_idです。 つまり、同一userが複数のinstanceを持ち、同一のinstanceが複数のuserに所持されうるというテーブル構成になっています、 今、行数は200あるとしますと、 delete from table where insance_id IN (select insance_id from table order by random() limit 100) としますと、tableの行が半減するわけではなく、同一instanceが複数userに所持されますので、もっと行数が減ってしまいます。 そこで、 # delete from table where instance_id AND user_id IN (select instance_id , user_id from table order by random() limit 100); というようなことをしたのですが、 ERROR: subquery has too many columns と出てしまいます。 2時間ほど、Webで調べて頑張ったのですが、よくわからないので、 これを実現するSQL文をお教えいただけませんか。 どうか、よろしくお願いいたします。

  • レジストリのキーを削除

    レジストリのキーを削除するためのREGファイルの記述方法を教えてもらえないでしょうか? レジストリの書き出しを行うと、REGファイルが作成されて、それを実行すると書き出した内容が追加されます。 でも、キーを削除するための記述がわかりません。 レジストリエディタで削除すればいい、と言わずに教えてください。(^^;

  • 複数のテーブルを参照して値を変更する方法

    お世話になっております。 以下のようなテーブルがあったとして、table1,table2の値を参照して加算し、master_tableの値を変更するようなSQLは一つの文で書く方法はありますでしょうか? 例えば、あるSQLを実行すると、master_tableのid1のscoreが500になるようなSQLです。 どなたかご教授ください。 master_table id | score 1 | 0 2 | 0 table1 id | score 1 | 100 2 | 300 table2 id | score 1 | 400 2 | 100

    • ベストアンサー
    • MySQL
  • C言語で書き込んだファイルの重複行の削除と行の並び変えるプログラミング

    C言語で書き込んだファイルの重複行の削除と行の並び変えるプログラミング ファイル名が 0.txt というC言語で書き込んだテキストファイルがあり その中身は以下のようなものとします。 111 000 222 555 000 444 222 000 これらを行ごとに見て重複行を削除し 更に値の小さな順に並び変えたい、つまりファイル内を 000 111 222 444 555 となるようなプログラミングを考えているのですが 調べても分からず悩んでいます。 c言語のプログラム内に UNIXコマンドを扱う方法を考えているのですが c言語内でUNIXコマンドを併用するためのsystem()関数 や 重複行を削除する uniq というUNIXコマンドを どのようにプログラム内に挿入すればいいのでしょうか? ご回答、よろしくお願いいたします。 ちなみに以下のプログラムは system関数が理解できない私の作成失敗したものです。 #include <stdio.h> #include <stdlib.h> int main(void) { system("uniq 0.txt"); }

  • ACCESS テーブルに2行目から取り込む方法

    Access2013で、 指定の場所に置いてあるCSVファイルに対して、 「リンクテーブルを作成してソースデータにリンクする」設定にてテーブルを作成し、 このCSVファイルが更新されても最新の状態にてレポートを出力できるようにしています。 しかしこのCSVデータが作成される仕様により、1行目に余計な文字列、2行目に項目名、3行目以降にデータが入っているため、毎回CSVデータの1行目を削除する手作業が発生しています。 2行目以降をリンクするようにするとか、テーブルの3行目以降を取り出すクエリとか方法はありませんでしょうか?