• 締切済み

MINUS の結果の rowid を取得したい

テーブル A, A@other のデータの全カラムの MINUS の結果を取得しその結果レコードの rowid を 取得する方法を検討しています。 A, A@other は異なるインスタンスの同一定義のテーブルです。 このとき、動的SQL を使用し テーブ ルA, A@other には任意のセットが入ります。 対象のテーブルには主キーが無い場合が有ります。 このような時に期待した結果を効率良く取得する方法をご教示下さい。 環境は Oracle 9iR2 (Miracle Linux 4)を使用しています。

みんなの回答

  • entree
  • ベストアンサー率55% (405/735)
回答No.1

MINUS句を使用したSQLはNOT EXISTS句を使用したSQLに置き換えれられるかと思います。 NOT EXISTS句を使用したSQLではROWIDも指定できます。 例えば、MINUS句を使用した以下のSQLは・・・ select cola1, cola2, cola3 from taba minus select colb1, colb2, colb3 from tabb; ↓ select rowid, cola1, cola2, cola3 from taba where exists (select * from tabb where cola1 = colb1 and cola2 = colb2 and cola3 = colb3);

ha8ka8
質問者

お礼

この方法だと主キーの無いテーブルの場合全カラムを WHERE 句で評価するクエリになるため、パフォーマンスが厳しいところがあるので敬遠していました。 どうもこの方方法しかなさそうですね。 こちらの方法で検討を進めます。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ROWIDが文字化け?してしまう

    皆様のお力をお貸し頂きたく思います。 Oracleデータベースについてです。 突然、ROWIDの表示が以下の様になってしまいました。 SQL> SELECT ROWID FROM BUSYO; ROWID ------------------ AAAF+0AAFAAAABDAAA AAAF+0AAFAAAABDAAB AAAF+0AAFAAAABDAAC AAAF+0AAFAAAABDAAD 通常なら結果として、 ROWID -------------       1       2       3       4 と表示されるはずです。 昨日までは数字で表示されていました。 他のカラムに格納されているデータは全く問題ありません。 日本語データも含まれていますが、問題なく表示されています。 TABLEのアナライズ、INDEXの再構築、インスタンスの再起動を 試してみましたが効果なし。 数字の表示に戻す方法を教えて頂きたく思います。 補足情報が必要な場合はお答え致します。 よろしくお願いします。 環境: Solaris 8 Oracle8.1.7

  • sqlite3でrowid以外にid必要ですか?

    sqlite3に挑戦中です。 これまでmysqlを使用していました。 sqlite3ですが、rowidというコラム(行番号)が自動的に付加しますね。 当初idとかnoというPRIMARY KEYをつけていたのですが、INSERTができないためidコラムをDrop Columnしました。 でも、抽出するときにrowidでSELECTしようと思ったら、抽出できるわけないですね。できる方法があったら、教えてください。 ↓こんなふうにrowidをセットしようと思ったら見事に空白でした。file= $s .= '<a href =./index.php?mode=check&file=' . $row["rowid"] . '>' . $row["name"] . '</a><br>'; ということはやっぱりid、noというプライマリーキーは必要でしょうか? もちろんnameが一意なので条件設定できますが、スマートでない気がします。 AUTO INCREMENTしてくれないので、一々、値を入れていかないといけないのでしょうか?mysqlだったら、自動的に番号を付加してくれるので、NULLや空白を入れていたのですが。 つまらない質問ですが、確認のためよろしくお願いします。

  • テーブル名をカラムとして取得する方法

    テーブル名をカラムとして取得する方法はありますでしょうか? オラクル8とVB6でプログラムを組んでいます。 例 TABLE Aの内容 カラム1 1 2 3 TABLE B カラム1の内容 4 5 6 SQLは簡略化してかきます。下記のSQLを実行した場合、 select A.カラム1 from A union select b.カラム1 from b 1 2 3 4 5 6 を取得できます。 例えば、上記で、SQL実行後、 下記のような値を取得したいです。 1 ,Aのテーブルだよ 2 ,Aのテーブルだよ 3 ,Aのテーブルだよ 4 ,Bのテーブルだよ 5 ,Bのテーブルだよ 6 ,Bのテーブルだよ それぞれのテーブルの名前を別名で結果に格納したいのです。 何か方法はありますでしょうか? なければ、unionせずに、2回SQLを発行し、それぞれに、 プログラム上で、「Aのテーブルだよ」を後で挿入したいと思っています。

  • ロール付与したタイムスタンプの取得は可能ですか?

    「あるオブジェクトに対する権限付与はいつされたのか。」 という事を調べることはできないか悩んでいます。 DBはOracle9iR2です。 テーブルやINDEXですと、XXX_OBJECTSのCREATEDやLAST_DDL_TIME から取得可能であると理解しているのですが、 「権限付与はいつされたのか」という情報はどこから求めれば 良いのでしょうか? XXX_TAB_PRIVSにCREATEDというカラムがあると良いのですが 見当たりませんでした。 もしかして、そもそもそんな情報は取得できないのでしょうか? もしご存知の方いらっしゃれば情報提供お願いいたします。

  • betweenで境界値が取得できない。

    連番の歯抜け値を取得するSQLを作りたいと思っています。 例えば、カラムAに、1,2,3,5,6,7,9,10(4と8が抜けている) と数値の入っているテーブルAがあるとします。 これに対して、 SELECT MIN(カラムA + 1) FROM テーブルA WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) とSQLを投げた場合、4が取得できます。 これにbetween句を付与したいのですが、そうすると境界値が なぜか取れなくて困ってます。 具体的には、 SELECT MIN(カラムA + 1) FROM テーブルA WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) AND BETWEEN 8 AND 10 とした場合、NULLが返ってきてしまいます。 普通、BETWEENは境界値も対象になるはずですが、何故このような 結果になってしまうのでしょうか? 修正点をご教授いただけないでしょうか? 宜しくお願いします。

  • mysqlのmatch() against()で検索結果が取得できませ

    mysqlのmatch() against()で検索結果が取得できません。 select * from fulltexttable where match( a ) against( '+ほげ' in boolean mode ) で検索結果は0件ですが、 select * from fulltexttable where a like '%ほげ%' だと検索結果は取得できます。 aカラムにはフルテキストインデックスは貼ってあります。 mysqlのバージョンは5.0.77 hogeテーブルはMyISAM どなたか助けてください。

  • SELECT/別テーブルのレコード数も取得したい

    ■環境 ・MySQL ■前提 ・テーブルA … idカラム ・テーブルB … A_idカラム ■やりたいこと ・テーブルAデータを取得する際、テーブルAレコードに応じて、テーブルB「A_idカラム」の数(レコード数)も取得したい ■取得イメージ例 ・テーブルA「全カラム」、「count」カラム ※「count」カラム … テーブルBにある「A_idカラム」の数 ■知りたいこと ・どこにも存在しないこの「count」カラムはどうやって作成したら良いでしょうか? ・全体のSQL文

    • ベストアンサー
    • MySQL
  • TIMESTAMP型が含まれるテーブルの列名の取得

    Oracle 11gを使用しているSQL初心者です。 テーブルの列名を取得する方法についての質問です。 テーブルの列名を取得するときは以下のSQLで取れると思っています。 select column_name from user_tab_columns where table_name = 'テーブル名'; --実行結果-- COLUMN_NAME ------------------------------ NAME1 NAME2 しかし、テーブルにTIMESTAMP型が含まれていると 「レコードが選択されませんでした。」 と表示されます。 TIMESTAMP型が含まれるテーブルは上記のSQLでは取得できないのでしょうか。 TIMESTAMP型が含まれるテーブルの列名の取得方法をご存知の方がいらっしゃいましたら、 ご教示ください。よろしくお願い致します。

  • 一番新しいdatetime型列があるレコードを取得

    下記条件を満たすSQL文を知りたいのですが、どう書けばよいでしょうか? ■構成 Aテーブル ・「id」カラム ・「created_at」カラム … datetime型 ・「area」カラム Bテーブル ・「a_id」カラム ・「created_at」カラム … datetime型 ■前提 ・Aテーブルの1レコード(「id」カラム)に対して、0~複数のBテーブルレコード(「a_idカラム」)がある ・A.id = B.a_id ■欲しい内容 ・「Aテーブル」「Bテーブル」それぞれのカラム内容全部。※条件あり ▼条件1 Aテーブル「id」カラムに対応したBテーブルの「a_id」が複数ある場合には、該当Aテーブル内容+ Bテーブル「created_at」カラムの値が一番新しいレコードを返す(取得レコード数は常に1) ▼条件2 Aテーブル「id」カラムに対応したBテーブルの「a_id」がなかった場合には、該当Aテーブル内容+ Bテーブル側は何も返さない ▼条件3 ※同名カラムを取得する際には、カラム名先頭にそれぞれa、bを付与(「acreated_at」「bcreated_at」) ・後で、それぞれのテーブルカラムとして利用したいだけなので、それが出来れば形式にこだわりはありません

    • ベストアンサー
    • MySQL
  • DBのテーブルについての質問です。

    SE業界に入りまだ半年のPGです。 今、現場においてテストを行っているのですが、 先にテーブに値を入れたエビデンスをExcelで作り、 その後にバッチを流し、結果を起票しています。 Excelから値を1カラムずつコピーし、 SQLserverのテーブルカラムにペーストしているのですが、 1ラインもしくは1テーブルごとにコピーペーストできる よい方法はないでしょうか? ご指導御よろしく願いいたします。