質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

解決済

Viewのみで使用するデータを保持する方法

heart_crimson
heart_crimson

総合スコア0

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

1回答

1評価

0クリップ

809閲覧

投稿2019/08/09 05:28

編集2022/01/12 10:58

前提・実現したいこと

PostgreSQLのテーブルをSelectしてViewを作成しました。
このViewは他プログラムと連携を行うためのものです。

発生している問題・エラーメッセージ

Viewに「シーケンス番号」(日内で連番を振る)と、
「そのデータが連携されたかどうか」のデータが必要になりました。
どのようなSQLを記述すればよいか、アドバイスをいただけないでしょうか。

該当のソースコード

現状は以下の通りです。

mst_item

[PK]item_id(serial)item_code(varchar(20))item_name(varchar(128))
1ITEM001アイテム①
2ITEM002アイテム②
3ITEM003アイテム③

trn_item_lot_info

[PK]item_id(integer)[PK]lot_number(varchar(20))quantity(numeric(16,6))shelf_life(date)
120190808011.0000002020-08-08
220190808012.0000002020-08-08
1201908090110.0000002020-08-09

view_item_result

SQL

CREATE VIEW view_item_result AS SELECT lpad(mst_item.item_code::text, 8)::character varying(8) AS item_code, to_char(round(trn_item_lot_info.quantity), 'FM0000'::text)::character varying(4) AS quantity, lpad(trn_item_lot_info.lot_number::text, 50)::character varying(10) AS lot_number, FROM trn_item_lot_info LEFT JOIN mst_item USING (item_id) ORDER BY trn_item_lot_info.item_id, trn_item_lot_info.shelf_life ;
item_codequantitylot_number
ITEM00100012019080801
ITEM00200022019080801
ITEM00100102019080901

この「view_item_result」に
「is_coordinated」というカラムと、
「date_seq」というカラムを増やしたいです。

要件は以下の通りです。

  • is_coordinated

・boolean型
・viewの1レコードごとに保持
・Viewにデータが増えた時(=trn_item_lot_infoにデータが書き込まれた時)はfalse
・他プログラムにデータを取得してもらったらtrueにする(この部分は他プログラムがViewに対しUPDATEを投げてもらう。RULEで実装予定)

  • date_seq

・integer型
・viewの1レコードごとに保持
・Viewにデータが増えた時(=trn_item_lot_infoにデータが書き込まれた時)、日内で連番を保持する

以上を踏まえ、希望のViewは以下の通りです。

item_codequantitylot_numberis_coordinateddate_seq
ITEM00100012019080801true1
ITEM00200022019080801true2
ITEM00100102019080901false1

データを取得済みですので1、2レコード目はis_coordinatedがtrueになっています。
また、1、2レコード目は同じ日にデータをinsertしたため、1、2と連番が振られています。
3レコード目は次の日にデータをinsertしたため、連番が1に戻っています。

試したこと

元々は「is_coordinated」のみだったため、
trn_item_lot_infoにカラムを追加し、保持していました。
(Viewでしか使わないデータをテーブルに持たせるのは変だとは思っていましたが、これしか方法が思いつきませんでした。)
しかし「date_seq」が増えたため「もっと別のやり方があるのではないか」と思い、質問させていただいた次第です。

いっそtrn_item_lot_infoがinsertされた時、triggerを用いて
「is_coordinated」と「date_seq」を追加したテーブルに書き込ませて、
それをViewでselectさせようかとも思いましたが回りくどいなと思っております。

情報が不足しておりましたらコメントください。
皆様のお知恵をお貸しいただければ幸いです。
どうぞよろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

PostgreSQL 9.3

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。