• ベストアンサー

取得元の表を条件によって変えるビューを作成したいのですが

2つの表AとBがあり、ほぼ同じ列が定義されているとします。 ある条件に該当する表Aが1件でも存在する場合、各項目は表Aから取得し、存在しない場合は表Bから取得する(取得するレコード数は異なる可能性があります)ビューを定義したいのですが、やり方がよく分かりません。 多少冗長になっても構いませんので、分かりやすい定義方法がありましたらお教え願います。 DBはORACLE9iです。

  • NAATAN
  • お礼率97% (214/220)

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>ある条件に該当する表Aが1件でも存在する場合、 うーん、viewじゃ無理じゃないですか? 条件が確定しない限り。 頭に浮かぶSQLは、副問い合わせの方にも条件が 必要になったり、抽出項目が確定しなかったりするんで・・・

NAATAN
質問者

お礼

ありがとうございます。 私の方でも、色々試してみます。

関連するQ&A

  • 同じテーブルからviewを作成しようとすると「ORA-00942: 表またはビューが存在しません。」というメッセージが出ます。

    viewを作成しようとしています。 asの後ろのselect文でひとつのテーブルを二度使って、 viewの列を二つ作りたいのですが、 「「ORA-00942: 表またはビューが存在しません。」」というメッセージが出てしまいます。 どういうことでしょうか。 具体的には下記のようなことです。 create or replace view tmp (a1,a2,b1,b2) as select abc.a1 as a1, abc.a2 as a2, abc.a1 as b1, abc.a2 as b2 from ABCtble abc よろしくお願いします。

  • 3つの表の外部結合

    3つの表があり、それぞれ次のデータが格納されているとします。 表A +-----+-----+-----+ |列A1 |列A2 | 列A3| +-----+-----+-----+ | A01 | B01 | A11 | | A02 | B02 | A12 | +-----+-----+-----+ 表B +-----+-----+-----+ |列B1 |列B2 |列B3 | +-----+-----+-----+ | B01 | X | B11 | | B01 | Y | B12 | | B02 | X | B13 | | B02 | Y | B14 | +-----+-----+-----+ 表C +-----+-----+ |列C1 |列C2 | +-----+-----+ | C01 | A11 | | C02 | A21 | | C03 | A12 | +-----+-----+ この場合、表Aと表BをA2とB1で等価結合し(但しB2='X') その結果導き出されたA3と表CのC2で外部結合し, B3の値を取得したいのです。 つまり、以下のような結果を得たいのです。 +-----+-----+ |列C1 |列B3 | +-----+-----+ | C01 | B11 | | C02 | null| | C03 | B13 | +-----+-----+ 表Aと表Bを結合した表を別名で定義し、 表Cと外部結合すれば可能だと思うのですが、 その様なやり方ではなく、 単純に3つの表を結合して行うことは出来ないのでしょうか。 尚、DBはORACLE9iです。

  • 全表走査のチューニング

    Oracle10gでA,B,Cという表があり、Aは50万件で80列、Bは50万件で15列、Cは30万件で15列という表があります。まず表Bを全表走査してGroup Byし、A,CとINNER JOINしてさらにA,B,CとINNER JOINして、ソートしています。諸事情があり、この方法以外選択肢はありません。 実稼働しており、あとはチューニングとしてパラメータの調整と物理的な配置の調整をするチャンスが1回だけあります。 DBサーバのCPUは2つで、ディスクはRAID1でEドライブのみ使用して、I/Oの分散はできません。インデックスは検索・結合列にすべて張っています。 特に気になるのは表Aの列が80列あり、2000文字格納する列も複数あって、列が長いです。DB_BLOCK_SIZEは8Kですがなんとか1ブロックに1レコードは収まっています。 このようなクセのある検索に効果のあるチューニングはありますでしょうか?

  • ある条件でのSQLの取得方法について

    以下の条件でのSQLのデータの取得方法が分かりません。 2つのテーブルがあるとします。 ・テーブルA キー   項目1 10     X 20     Y ・テーブルB キー  項目2  項目3 10     5    C 10     6    D 12     6    E ここで取得する条件として ■テーブルAにあるのは、必ず取得します。 ■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は  別レコードとして取得します。 ■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、  複数件あるかも知れません。  無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。 ■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと  同じレコードに、項目2が同じデータの情報を出力します。  項目2が同じデータが無い場合はこの情報は出力しません。  項目2が同じ値のデータは最大2件しかありません。 上記の例の場合に出力したい結果 ・出力テーブルC キー  フラグ   項目1  項目2  項目3   項目2が同じキー  項目2が同じ値 10  テーブルA   X 10  テーブルB         5    C 10  テーブルB         6    D        12            E 20  テーブルA   Y (テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します) これを出来ればSQL、出来なければPL/SQLで取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?

  • 表の結合(性能)

    2つのテーブルを(内部)結合させる場合、 INNER JOINによる結合と WHERE句に結合条件を記述する2通りの方法が あると思いますが、どちらが早いのでしょうか? なお、Oracle9i、ルールベースにて構築されています。 テーブルの内容、SQL文は下記のとおりです。 ご教授よろしくお願いします。 ■表 A 項目A-1 ・・・PRIMARY KEY1、INDEX1 項目A-2 ・・・PRIMARY KEY2、INDEX2 項目A-3 ・・・PRIMARY KEY3 項目A-4 ■表 B 項目B-1 ・・・PRIMARY KEY1、INDEX1 項目B-2 ・・・PRIMARY KEY2、INDEX2 項目B-3 ・・・PRIMARY KEY3 項目B-4 ※項目A-1と項目B-1にて結合。  項目A-2が"01"と等しいレコード。 表Aのレコード件数>表Bのレコード件数 【WHERE句にて結合】 SELECT * FROM A,B where A.項目1 = B.項目1 and A.項目2 = '01' 【INNER JOINにて結合】 SELECT * FROM A INNER JOIN A ON A.項目1 = B.項目1 AND A.項目2 = '01'

  • OracleのViewの作り方

    OracleのViewについてですが。。 ‘あ行’という名前のテーブルと‘か行’という名前のテーブルがあるとします。 ‘あ行’テーブルには‘あ’,‘い’,‘う’という列名があり、 ‘か行’には‘か’,‘き’,‘く’,‘あ’,‘い’という列名があるとします。 以上の2つのテーブルから‘ひらがな’というViewを作りたいとします。 このViewの条件としては‘あ行’から‘あ’,‘い’をselectし、‘か行’からは‘あ行’と‘か行’のそれぞれの‘あ’列の項目が同じであるレコードから‘か’と‘あ’と‘い’をselectしてきます。この時‘あ’という列の項目内容は分かっていて、その項目が記載してあるレコードに‘い’の項目内容をupdateしたいとするとどのようにViewを書けばよいのでしょうか?あくまでもそれぞれのテーブルに直接‘い’項目を書くのではなくてViewにおいてUpdateで書きたいのですが。

  • ORACLE DBのコピー

    同一フォーマットのORACLE_DBが2つ存在しており、A_DBからB_DBへコピーのような形式でレコードを移送したいのですが、方法を教えてください。 ORACLE8 VC++でのコーディングを検討

  • 2テーブルの別カラムを一つにまとめたViewの作成

    以下の2つのテーブルがあった場合 Aテーブル 商品番号,種別 123456,A 123456,C 123456,M Bテーブル 商品番号親 123456 123123 123321 以下のようなView にしたいのですができますでしょうか。 Viewテーブル 新商品番号 123456 123123 123321 A123456 C123456 M123456 上3レコードは、Bテーブルのレコード、 下3レコードは、Aテーブルの種別と、商品番号を、CONCATしています。 なお、Viewテーブルは、全てユニークなレコードになります。 すみませんが、ご回答よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 異なるスキーマのビューを元にしたマテリアライズドビューの作成

    「所有していないマテリアライズド・ビューのマスター表にアクセスする場合は、各表に対するSELECTオブジェクト権限またはSELECT ANY TABLEシステム権限が必要です。」 ということから、selectオブジェクト権限をつけた『ビュー』をもとに、マテリアライズドビューの作成はできないのでしょうか? 例)Aスキーマが所有するTESTビュー表をもとに、Bスキーマでマテリアライズドビューを作成する。 create materialized view mview as select * from A.TESTビュー; create materialized view 権限は付与しました。 A.TESTビューに対するSELECTオブジェクト権限は付与しました。 結果としては、表またはビューがありません。とエラーがでます。 しかし、Aスキーマが所有するテーブルに対しては、問題なくマテリアライズドビューの作成はできます。 異なるスキーマの『ビュー』を元にマテリアライズドビューの作成は できない。といった記述はないのですが、実際に作成ができません。 ご教授ください。

  • 表の横の列を取得

    エクセルで表の欄外の、表の横の列を取得する、 というBVAはあるのでしょうか。 具体的に列のAとかBを指定するコード?は あると思うのですが、表の欄外の横の列に合計を表示させたい、 となった場合を考えています。 たとえば表がA1~C5という場合もあると思いますし 表がA2~D6という場合もあると思うので、臨機応変に 欄外に合計額を表示させたいと思っていました。 そうでなければ、都度、表の場所などが変わるごとに VBAを書き換える必要が出てくると思うのです・・・。