- ベストアンサー
取得元の表を条件によって変えるビューを作成したいのですが
2つの表AとBがあり、ほぼ同じ列が定義されているとします。 ある条件に該当する表Aが1件でも存在する場合、各項目は表Aから取得し、存在しない場合は表Bから取得する(取得するレコード数は異なる可能性があります)ビューを定義したいのですが、やり方がよく分かりません。 多少冗長になっても構いませんので、分かりやすい定義方法がありましたらお教え願います。 DBはORACLE9iです。
- NAATAN
- お礼率97% (214/220)
- その他(データベース)
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>ある条件に該当する表Aが1件でも存在する場合、 うーん、viewじゃ無理じゃないですか? 条件が確定しない限り。 頭に浮かぶSQLは、副問い合わせの方にも条件が 必要になったり、抽出項目が確定しなかったりするんで・・・
関連する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 よろしくお願いします。
- ベストアンサー
- Oracle
- 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レコードは収まっています。 このようなクセのある検索に効果のあるチューニングはありますでしょうか?
- ベストアンサー
- Oracle
- ある条件での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で取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?
- ベストアンサー
- Oracle
- 表の結合(性能)
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
- 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スキーマが所有するテーブルに対しては、問題なくマテリアライズドビューの作成はできます。 異なるスキーマの『ビュー』を元にマテリアライズドビューの作成は できない。といった記述はないのですが、実際に作成ができません。 ご教授ください。
- ベストアンサー
- Oracle
- 表の横の列を取得
エクセルで表の欄外の、表の横の列を取得する、 というBVAはあるのでしょうか。 具体的に列のAとかBを指定するコード?は あると思うのですが、表の欄外の横の列に合計を表示させたい、 となった場合を考えています。 たとえば表がA1~C5という場合もあると思いますし 表がA2~D6という場合もあると思うので、臨機応変に 欄外に合計額を表示させたいと思っていました。 そうでなければ、都度、表の場所などが変わるごとに VBAを書き換える必要が出てくると思うのです・・・。
- 締切済み
- Excel(エクセル)
お礼
ありがとうございます。 私の方でも、色々試してみます。