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

A 回答 (1件)

条件がもうひとつはっきりしないので、よく分かりませんが、取りあえず、亜行テーブルからは、全行を、か行テーブルからは、条件に合うもののみを持ってくるViewのSelect文は以下のようになると思います。


select か行.か,あ行.あ,あ行.い from あ行,か行 where あ行.あ=か行.あ(+)

「い」をUpdateしたい、ということですが、それはあ行テーブルの「い」でしょうか?それともか行テーブル?、両方?そのあたりがはっきりしないと分かりませんが、2つ以上のテーブルを結合させたViewに対し、Updateをかけるのは難しいと基本的に思っていただいたほうが良いかと思います。

どうしても、Updateをかけたいという場合の方法として、ひとつの案ですが、テンポラリテーブルを作ります。(「か」、「あ」、「い」列のあるもの)これに対し、あ行テーブルの変更などに対してのトリガー、か行テーブルに対しての変更に対するトリガー、テンポラリテーブルに対する変更を元テーブルに書き戻すためのトリガーを作成するれば、テンポラリテーブルをViewのように使うことができると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q別テーブルからSELECTした値を持つ行を削除するSQLは?

削除 SQL がわかりません。

SQL-1
SELECT id FROM table2 WHERE date_in IS NULL;

これで取得したidを持つレコード(別テーブル)を削除したいのですが、
どうすれば組み合わさるのでしょうか?

DELETE FROM table1 WHERE id=???

Aベストアンサー

サブクエリ(副問い合わせ)を使います。

DELETE FROM table1 WHERE id IN (SELECT ~)

こんな感じです。

Qviewにidentity列の追加

viewにidentity列を追加したいのですが、SQL文が分からなくて困っています。
追加する方法をご存知の方がいましたらよろしくお願いします。

作りたいviewは以下のようなviewです。

・テーブルA
ID  NAME   ADDRESS
1   山田    東京
2   鈴木    埼玉
3   田中    千葉
4   佐藤    埼玉
5   藤田    東京
6   石田    神奈川
7   松田    千葉

・作成したいview

ID  ADDRESS  出身人数
1   神奈川      1
2    埼玉      2
3    千葉      2 
4    東京      2

↑このID列をidentity列にしたいと考えています。
使用しているDBはH2です。よろしくお願いします。

Aベストアンサー

H2を良く知らないのですが、一般的には、group byとRownum()とを一緒に使うと
うまくいかないのではなかったかと。

SELECT ROWNUM ( ) AS ID,ADDRESS,COUNT(*) AS 出身人数
FROM SAMPLE
GROUP BY ADDRESS
ではなく、
SELECT ROWNUM ( ) AS ID,ADDRESS,出身人数
from
(
select ADDRESS,COUNT(*) AS 出身人数
FROM SAMPLE
GROUP BY ADDRESS
)
とするとうまくいくのでは?

ANO.1の方が示しておられるURLの
The first row has the row number 1, and is calculated before ordering and grouping the result set・・・
To get the row number after ordering and grouping, use a subquery.
というのが、
「group byの前に連番振りますよ、但し・・・。
サブクエリを使うと、group byの後に連番を振りますよ。」(適当な意訳ですけど)
つまり上記の意味です。

H2を良く知らないのですが、一般的には、group byとRownum()とを一緒に使うと
うまくいかないのではなかったかと。

SELECT ROWNUM ( ) AS ID,ADDRESS,COUNT(*) AS 出身人数
FROM SAMPLE
GROUP BY ADDRESS
ではなく、
SELECT ROWNUM ( ) AS ID,ADDRESS,出身人数
from
(
select ADDRESS,COUNT(*) AS 出身人数
FROM SAMPLE
GROUP BY ADDRESS
)
とするとうまくいくのでは?

ANO.1の方が示しておられるURLの
The first row has the row number 1, and is calculated before ordering and grouping the result set・...続きを読む

Q項目があったりなかったりするテーブル設計について。

伊藤と申します。
postgreSQL7.2.2を使用して、Webアプリケーションを制作しています。
テーブル設計で迷っているところがあります。

HTMLのフォームのデータを取り込み、データベースに格納する、
と言う事をしたいのですが、クライアントが自由に
フォームの内容を変えることができるようになっています。

そこで、変わったパターンが出てきてテーブル設計に困っています。

Radioボタンが3つあるとします。
1番目と2番目がチェックされるときは問題ないのですが、
3番目をチェックしたときにはさらに、
テキストボックスに入力を求められる事があるのです。

 下記のような場合が問題になります。
====================================
Q2 あなたのすきな食べ物は?

○りんご
○みかん
○その他 ↓下のボックスに入力してください
 ______________
|______________|

====================================

以下が現状です。

■環境
OS:Turbolinux 7 Server
DBサーバ:postgreSQL

■テーブル
・質問テーブル
・質問選択肢テーブル
・回答テーブル

■キー
質問テーブルの主キー(質問ID)に対して、
質問選択肢テーブルにある外部キーがリレーションします。
質問選択肢テーブルにはシーケンスもあり(選択肢No)、
質問IDと選択肢Noで主キーとしています。

■問題
・例外的な選択肢追加を(ある選択肢に対して並行に)
 可能にするには質問選択肢テーブルをどう設計すればいいのか。
・回答テーブルに通常なら選択された値をレコードに
 格納するだけだが、
 ひとつ項目が増える事もイレギュラー的に発生するので、
 回答テーブルどう設計するか。

以上2点です。

長くなって申し訳ありません。
ご教授よろしくお願い申し上げます。

伊藤と申します。
postgreSQL7.2.2を使用して、Webアプリケーションを制作しています。
テーブル設計で迷っているところがあります。

HTMLのフォームのデータを取り込み、データベースに格納する、
と言う事をしたいのですが、クライアントが自由に
フォームの内容を変えることができるようになっています。

そこで、変わったパターンが出てきてテーブル設計に困っています。

Radioボタンが3つあるとします。
1番目と2番目がチェックされるときは問題ないのですが、
3番目をチェックしたときにはさ...続きを読む

Aベストアンサー

きちんと正規化を考えるのであれば案2、案1も実際は十分ありえる設計
かと思います。

質問テーブル
フィールド名 /内容
--------------------------------------------------------------
質問ID /2
質問内容 /あなたのすきな食べ物は?

質問選択肢テーブル
質問ID /2
選択肢No /3
選択肢 /その他 ↓下のボックスに入力してください
BOX数 /1

◆案1
1選択肢に対し複数BOXあれば複数の「回答」フィールドを用意
回答テーブル
質問ID /2
選択肢No /3
回答1 /ボックス入力内容1(ボックス無の場合はNULL)
回答2 /ボックス入力内容2(ボックス無の場合はNULL)
回答3 /ボックス入力内容3(ボックス無の場合はNULL)
回答4 /ボックス入力内容4(ボックス無の場合はNULL)


◆案2
回答テーブル1
質問ID /2
選択肢No /3

回答テーブル2
ボックス有りの場合のみレコード作成
1選択肢に対し複数BOXあれば複数行作成
質問ID /2
選択肢No /3
回答ID /1
回答 /ボックス入力内容1

きちんと正規化を考えるのであれば案2、案1も実際は十分ありえる設計
かと思います。

質問テーブル
フィールド名 /内容
--------------------------------------------------------------
質問ID /2
質問内容 /あなたのすきな食べ物は?

質問選択肢テーブル
質問ID /2
選択肢No /3
選択肢 /その他 ↓下のボックスに入力してください
BOX...続きを読む

QORDER BY の項目を SELECT する効果

ORDER BY の項目を SELECT する項目に含めるか否かで、速度や
メモリ消費の点で何らかの差がでるでしょうか?どちらが望ましい
という点も含めてプロフェッショナルの方の回答をお待ちしています。

Aベストアンサー

長い間、標準SQL及び多くのRDBMSでは、「ORDER BYで指定する項目は、SELECTの選択リストで指定した項目でなければならない」という制限がありました。
「SELECTの選択リストで指定していない項目でも、ORDER BY指定が可能」となったのは、比較的、最近のことです。
現在でも、「ORDER BYで式を指定」した場合などで、RDBMSにより、最適なアクセス計画を生成できないといった問題があります。

記述したSQLで、性能が出せるかどうかは、使用しているRDBMS、バージョンにより、大きな違いが生じます。
ORDER BYに関しては、メモリ消費よりは、インデクスを有効活用し、ソートを抑止できるかどうかが、利用者側にはっきり見えるところです。

自分で使うRDBMS及びバージョンで、どういうアクセス計画が生成されるかという、分析は必須です。

QSELECT項目以外でソートする場合

お世話様です。

Access2003 VBAで、クエリ結果をフォーム上のリストボックスに表示する際、
リストボックスに出力しない項目(SELECT項目に含まれていない項目)で
ソートはかけられるのでしょうか?

例:リストA.RowSource = SELECT 項目1, 項目2, 項目3 FROM テーブル名 ORDER BY 項目4
  の様な事がしたいのです。

現段階では調べきれていないため、
出力したくない項目の幅をソース上でゼロにし、
擬似的に非表示にする事で回避しています。

SQL文法の問題になってしまうかもしれませんが、
よろしくお願いいたします。

Aベストアンサー

大丈夫です。

心配なら SQL 部分をクエリのSQLビューに記述し、デザインビュー表示にしてみてください

ただし、項目4 は、そのテーブルにあるフィールドになります。


人気Q&Aランキング

おすすめ情報