DBなといっても、Oracleしか、使ったことがありません。Oracleのページです。


その1 ある表にないものをSelectする。

EXISTS

普段から、頭を柔らかくして、何を取出したいのかということに神経を使います。
特に、COBOLを使われているかたは、要注意です。
良くある例は、カーソルを、シーケンシャルファイルのように、使ってみたりしています。
僕が、見た中で最悪は、ある表にないものを求めるために、カーソルを2つ使って、COBOLのマッチングをやってました。
帳票では、こうしないと、できないかなあ?というのは、ありますが・・・
(A表とB表を左右にプリントしてキーが無い場合は、空白にするとか。)
過去一年間の履歴表に無いデータを取出す、なんてプログラムが良くあります。
過去一年間、動きの無い部品を調べろ!・・・とかね。
AXB.jpg
上の黄色い部分を取出すことにします。
キーとして、A表、B表、共に「部品コード」を持っていることにします。

Select 黄色い部分 From A表 Where Not Exists (Select * From A表.部品コード = B表.部品コード);

逆に青い部分は Not Exists が Exists になります。

参考図書   はじめてのSQL「基礎から始めるデータベース操作」  技術評論社

(簡単でわかりやすく僕の部署でも、評判が良かった本です。お勧めします。)


その2 簡単なテスト環境の作り方。
Create Database文でもう一つ、データベースを作れれば良いのですが、そこまでは、面倒だ、という型の為に。
まず、テスト環境用のユーザーを作ります。

Create User [user_Name] Identified By [PassWord];
必要な権限を付与します。

(とりあえず、Create Session、Create Table権限あたり)
Grant [権限] To [User];で権限を付与します。

新規ユーザーで接続しTableを作成します。

Create Table Table名 As Select * From 運用ユーザー.Table名;

または、テーブルを作成してから、

Insert Into Table名 (Select * From 運用ユーザー.Table名;

これだと、運用ユーザーに対するSelect権限が必要になります。
そんなの、めんどくせーと言うあなたの為に。
SQL*PLUSのCOPYコマンドが有ります。

Copy From [運用ユーザー名]/[パスワード]@[接続文字列] To [テストユーザー名]/[パスワード]@[接続文字列]

[Option] [テストユーザー名].[Table名] Using [SQL文];

Option
Append---追加します。Tableが無ければ作成します。
Create---Table作成後、挿入します。Tableがあればエラーを返します。
Insert---挿入します。Tableが無ければエラーを返します。
Replace--既存のTableを削除後、挿入します。

別のデータベース(インスタンス)から、Copyする事も出来ます。
ただ、あまり多量のデータには、向かないようです。
バインド配列とか、Fetchサイズのパラメータをいじらないとエラーになることがあります。
ま、テスト用ならお手軽では無いでしょうか?

ケースバイケースで使い分けましょう。

あ、補足ですけど・・・
こういうふうに、実際の運用データと、テスト系のデータをSQL*PLUSかなんかで、交互にいじることになるのですが、
Table名はきちんと、スキーマ名で修飾するようにした方が良いと思います。
Select * From スキーマ名.Table名 です。
特に、Drop,Truncateあたりは。

じつは運用データを間違えてDropしたことがあったりする。(びびったよお(~_~;)内緒)


戻る