• 締切済み

仮想表について教えてください

「CREATE VIEW」について教えてください。 以下の仮想表に「B1]という項目を設けたいです。 「B1」は条件があり「test.A1>100」「test.A2=2」 であれば「B1」には「1」が表示され、それ以外の場合は 「0」を表示したいです。 「CREATE OR REPLACE VIEW test2 AS select test.A1 test.A2 FROM test WITH READ ONLY」 上記仮想表に「B1」を上手く追加するにはどのようにしたらよいでしょうか? すみませんが宜しくお願いします。

みんなの回答

  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.1

RDBに依存するかもしれませんが SQL-92以降であればCASEが使えます。 SELECT A1, A2, CASE WHEN A1>100 THEN CASE WHEN A2=2 THEN 1 ELSE 0 END ELSE 0 END AS B1 FROM test

zibika
質問者

お礼

ありがとうございました。 とても助かりました。

関連する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 よろしくお願いします。

  • ビュー表の使い方

    環境はOracle8iです。 とある業務で、グループ関数を使ったビュー表を作り、更にそこからグループ化する、というのをやっています。 CREATE VIEW V_emp AS SELECT A , B , SUM(C) AS X FROM emp GROUP BY A , B ; を作った後に、 SELECT A , SUM(B) , SUM(X) FROM V_emp GROUP BY A ; と問い合わせる、みたいなかんじです。 なんとなく、一方で集計結果を維持したまま、もう一回集計をかけるというのが、 データベースにとっては負担のような気がするのですが、実際はどうなのでしょう? 若しくはもっとスマートなやり方があるのでしょうか。

  • トリガーにてビューを作成しようとすると・・

    WindowsXPのOracle9i環境です。 以下のようなトリガーを作成しました。 create or replace trigger kan_trg after update or insert on t_kan declare begin execute immediate 'create or replace view V_test as select ・・ from t_kan with read only'; end; / その後、試しに「insert into t_kan ・・・」 と実行してみましたが、「ORA-04092:トリガーはCOMMITできません」が発生します。 色々調べましたがトリガーの中にCOMMIT文を入れることはできないようです。どのようにすれば解決するか、ご教示いただけませんでしょうか? 宜しくお願い致します。

  • [materialized]マテリアライズドビューの検索

    マテリアライズドビューを作成し、selelct文を発行致しましたら、 『"TEST2":無効な識別子です。』とエラーが出てしまいました。 下記の様に、テーブル、View、マテリアライズドビューを作成した後、 select文を作成しました。 View、マテリアライズドビュー、select文のいずれかで間違いが有ると思うのですが、どの様に修正を行えば良いのかが分かりません。 ですのでエラーを回避する方法を教えて頂きたく思っております。 宜しくお願い致します。 ■テーブル1作成 Create table TEST_TBL1 ( Test1 nchar(6), Test2 nchar(6) ); ■テーブル2作成 Create table TEST_TBL2 ( Test1 nchar(6), Test2 nchar(6) ); ■レコード追加 INSERT INTO TEST_TBL1 (Test1, Test2) VALUES (1,1); INSERT INTO TEST_TBL1 (Test1, Test2) VALUES (2,2); INSERT INTO TEST_TBL2 (Test1, Test2) VALUES (3,3); INSERT INTO TEST_TBL2 (Test1, Test2) VALUES (4,4); ■ビュー作成 create view TEST_VIEW as select A.rowid AROWID,A.Test1 ID,A.Test2 TITLE,3 MARKER from TEST_TBL1 A union all select B.rowid AROWID,B.Test1 ID,B.Test2 TITLE,4 MARKER from TEST_TBL2 B; ■ログ作成 create materialized view log on TEST_TBL1 with sequence,rowid (Test1, Test2) including new values; create materialized view log on TEST_TBL2 with sequence,rowid (Test1, Test2) including new values; ■マテビュー作成 create materialized view TEST_MVIEW REFRESH FAST on demand as select * from TEST_VIEW; ■データ抽出 Select TEST1 FROM TEST_MVIEW WHERE TEST2 = '1'; ご回答の程、宜しくお願い致します。

  • シンプルなSQLの書き方がわかりません。

    以下のSQLをシンプルに一つにしたいのですが、どのように書いたらよろしいでしょうか? どうぞご返答頂けますようお願い申し上げます。 --test1_tblの抽出 select a1 as a1, b1 as b1 from a_tbl where c=1 --test2_tblの抽出 select a1 as a1, e1 as e1 from b_tbl where rowid in (select min(rowid) from ee group by a1) and a1 is not null and a1 !=' ' order by a1 --test1_tblとtest2tblの結合 select t0.a1 as a1, t0.b1 as b1, t1.e1 as e1 FROM test1_tbl t0, test2_tbl t1 WHERE (t0.a1 = t1.a1)

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

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

  • 「#エラー」を含んでいても、並べ替えができるようになりたい。

    テーブル1 A-a B-b テーブル2 A-a C-c クエリ1 SELECT Replace(テーブル1![1],"-","") AS 1 FROM テーブル1; クエリ2 SELECT Replace(テーブル2![2],"-","") AS 2 FROM テーブル2; クエリ3 SELECT クエリ1.[1], クエリ2.[2] FROM クエリ2 RIGHT JOIN クエリ1 ON クエリ2.[2] = クエリ1.[1]; ****************************************************************** 各テーブルのクエリを作成し、Replace関数で置換して、 その置換後の各クエリを、さらにクエリを作成して結合しています。 その時に、 テーブル1にはあるのにテーブル2にない値が 「#エラー」となるのですが、 この状態でも並べ替えを出来るようにするにはどうすればいいでしょうか? 他の値にデータ型を変えるのでしょうか? 「#エラー」があるフィールドは並べ替えも出来ないですし、 デザインビューの抽出条件で 「Not Like "#エラー"」 としても 「抽出条件でデータ型が一致しません。」 というエラーになり、データシートビューで表示できません。 アドバイス宜しくお願い致します。

  • ビュー定義に集約関数を入れる方法を教えてください

    mysql5.0.27です。 ビューを定義するところで、集約関数(例えば、count())の結果をビューの属性のひとつにするには、どのように書けばよいのか、教えてください。 例えば、table_Aとtable_Bから、hoge_viewというビューを作る場合。hoge_viewには属性が2つあって、1つはtable_Aのitemという属性をそのまま定義し、もう1つはtable_Bのdataという属性(数字とします)を全レコードにわたって足し合わせたものとしたい時、どのように書けばいいのでしょうか。 下のようなものを試してみたんですが、当然ですが、動きません。 CREATE OR REPLACE VIEW hoge_view ( item, sum_data ) AS SELECT table_A.item, (count(table_B.data)) <---- ここがよくわかりません! FROM table_A, table_B;

  • viewの性能

    あるテーブルがあって、Viewがそのままテーブルを参照してます。 そのViewをそのまま参照しているViewが階層的にあるとします。 テーブルA ← View1 ← View2 ← View3 [SQL的イメージは] ・creat table テーブルA (・・・) ・create view1 as select * from テーブルA ・create view2 as select * from view1 ・create view3 as select * from view2 質問したい事として、 View1 を参照するのとView3を参照するのは、View1を参照するのが 階層化が無い分、速いのでしょうか? それともそのまま参照している場合、あまり速さは変わらないのでしょうか?

  • SQL 表の結合

    SQLで2つの表から条件に合ったデータを取り出し、同じ列に表示させたいのですが、 どうやっても外部結合のようにすることしかできませんでした。 取り出したデータを縦に結合?させることはできるのでしょうか? 例) dataは月の上旬中旬下旬でそれぞれabcとします。 入力値はmonthとdayで、これらからuriageを選択します。 dataの取りうる値はa,b,c,ab,bc,abcとします。    table:A 売上表            table:B 上旬中旬下旬判断 ---------------------------   -----------  key | data | month | uriage   day | data ---------------------------    -----------   1 |  a  |  1  |  500      1 |  a   2 |  ab  |  1  |  800     … |  …   3 |  bc  |  1  |  400     10 |  a   4 |  c  |  1  |  100     11 |  b   5 |  abc |  1  |  900     … |  …   … |  …  |  …  | …     31 |  c ---------------------------    ----------- month = 1 , day =5のとき  table:Bより   SELECT data FROM table:B WHERE day = 5 としてdata "a" を得ます。 この"a"と同じdataを持つuriageを表示させたいので   SELECT uriage FROM table:A   WHERE month = 1 AND data = (SELECT data FROM table:B WHERE day = 5) として  table:query1  --------    uriage  --------    500  -------- を得ました。 ここまでは良いのですが、これに付け加えて、 table:Bから取り出したdata "a"をtable:Aのdataが含むとき(data = a,ab,abcのとき) その全てのuriageを表示させたく、 ワイルドカードを使おうと   SELECT uriage FROM table:A   WHERE month = 1 AND data = %(SELECT data FROM table:B WHERE day = 5)% 等としてみたのですが、上手くいきませんでした。 そこで、別のクエリーを作って   SELECT uriage FROM table:A   WHERE month = 1 AND data = 'ab' AND data = 'abc' として  table:query2  ---------   uriage  ---------    800  ---------    900  ---------- を得ました。 そして、最後に、 得られた2つの表をまとめて  ---------   uriage  ---------    500  ---------    800  ---------    900  --------- としたいのですが、   SELECT uriage, uriage FROM query1, query2 とすると  ------------------   uriage | uriage  ------------------    500  |  800    500  |  900  ------------------ となりますし、UNIONは使い方がよくわからないためシンタックスエラーにしかならず...。 そもそも、縦に結合?はできるのでしょうか??? あれこれ試してみたのですが、詰まってしまったので、 どなたか知恵をお貸しください。