- PR -

SQL-変更元NOフィールドを頼りに最新NOに変えたビューを作りたい

投稿者投稿内容
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-11-08 14:12
いつもお世話になります。

件名が適切かどうか自信がありませんが・・・申し訳ありません。

システムの履歴をどんどん追加していくテーブルがあります。
データの追加、変更などを伝票区分で判断し、
UPDATE等は行わずに常にINSERTするテーブルです。

その中で、オーダー振替という処理があり、
オーダー振替を行ったときには、振替元オーダーNOをセットします。
オーダー振替は何度でも可能です。

データのイメージは以下の通りです。

SEQ    オーダーNO    振替元オーダーNO

1       111-01      空白
2       111-01      空白
3       111-02      111-01   ←オーダー振替発生
4       111-02      空白
5       111-02      空白
6       111-03      111-02   ←オーダー振替発生
7       111-03      空白


上記の場合、全てのデータのオーダーNOを「111-03」
と返してくるビューを作りたいのですが、可能でしょうか。

その場合、どのようなSQLになるのかご教授いただけないでしょうか。
何卒、よろしくお願い致します。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-11-08 14:49
引用:

UPDATE等は行わずに常にINSERTするテーブルです。

その中で、オーダー振替という処理があり、
オーダー振替を行ったときには、振替元オーダーNOをセットします。
オーダー振替は何度でも可能です。



オーダー振替というのは、空白を振替元オーダーNOでUPDATEする処理ではないの
でしょうか?
空白というのは、NULLではなく、本当に空白を格納しているのですか?

引用:

上記の場合、全てのデータのオーダーNOを「111-03」
と返してくるビューを作りたいのですが、可能でしょうか。



具体的に、どういう検索結果を希望しているのでしょうか?
オーダーNO列の値でなく、無条件に定数で「111-03」を返して欲しいという訳
ではないですよね?

それと、RDBMS名とバージョンを明記してください。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-11-08 14:58
忠犬さん、書き込み有難うございます。
説明不足で申し訳ありません。

・DBは SQLServer2005 です。

・「空白」と書いたのは、本当は半角スペースです。
当システムでは「半角スペース=空白」です。

引用:

オーダー振替というのは、空白を振替元オーダーNOでUPDATEする処理ではないのですか。



はい。振替元オーダーNOに振替前のオーダーNOが入った新しいレコードがINSERTされます。


欲しい結果は、上記7件ののデータを

SEQ    オーダーNO    振替元オーダーNO

1       111-03      空白
2       111-03      空白
3       111-03      111-01
4       111-03      空白
5       111-03      空白
6       111-03      111-02
7       111-03      空白

と、振替前のデータも全て最新のオーダーNOを表示した状態のデータです。
もちろん固定文字列ではありません。


ややこしくて申し訳ありませんが、何卒よろしくお願い致します。

忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-11-08 15:30
あまり深読みせず、提示された条件だけでのSQL例です。

コード:
create table tbl1
(SEQ            int   primary key,
 OrderNo        char(6),
 F_OrderNo      char(6));
insert into tbl1 values(1,'111-01',' ');
insert into tbl1 values(2,'111-01',' ');
insert into tbl1 values(3,'111-02','111-01');
insert into tbl1 values(4,'111-02',' ');
insert into tbl1 values(5,'111-02',' ');
insert into tbl1 values(6,'111-03','111-02');
insert into tbl1 values(7,'111-03',' ');

create view vtbl1
 as
  select
    SEQ,
    (select max(OrderNo) from tbl1) as OrderNo,
    F_OrderNo
   from tbl1
;

select * from vtbl1 order by SEQ;

reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-11-08 18:20
忠犬さん、書き込み有難うございます。

すみません。私の説明が悪かったようです。


SEQ    オーダーNO    振替元オーダーNO

1       111-01      空白
2       111-01      空白
3       111-02      111-01   ←オーダー振替発生
4       111-02      空白
5       111-02      空白
6       111-03      111-02   ←オーダー振替発生
7       111-03      空白
8       111-04      空白    ←オーダー振替発生してないデータ
9       111-05      空白    ←オーダー振替発生してないデータ


の場合、

SEQ    オーダーNO    振替元オーダーNO

1       111-03      空白
2       111-03      空白
3       111-03      111-01   ←オーダー振替発生
4       111-03      空白
5       111-03      空白
6       111-03      111-02   ←オーダー振替発生
7       111-03      空白
8       111-04      空白    ←オーダー振替発生してないデータ
9       111-05      空白    ←オーダー振替発生してないデータ


・・・のような結果が返ってきて欲しいのです。

いかがでしょうか・・・。


七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2007-11-08 21:23
さっぱりわからない VIEWだから問い合わせを実行するんですよね?
何をどうしたいのかSTEPごとに説明してください

忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-11-08 22:13
たぶんやりたいことは、再帰クエリなのだと思います。
SQL Server 2005で、SQL-99準拠のWITH句が実装されているので、クエリとしては
可能なように思いますが、同一キー値の別の行で、上位のキー値を持っていたり、
空白だったりする点を工夫する必要があるような。
無理に再帰クエリを使うより、ストアドプロシジャ化した方が性能が出せるかも。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-11-09 08:54
かなり説明が悪くてご迷惑をおかけしております。
本当に申し訳ありません。

説明から省いていましたが、項目には伝票区分という項目もあります。
伝票区分で何のデータなのかを知ることが出来ます。
もちろん伝票区分のほかにも入庫日等色々な項目があります。

伝票区分で判断する情報は、例えば、
  ・入庫
  ・データ修正
  ・出庫
  ・オーダー振替
  ・削除

・・・等々です。

仮に伝票区分を以下のように設定して流れを説明します。

  ・入庫       100
  ・データ修正    200
  ・出庫       300
  ・オーダー振替   400




SEQ    オーダーNO    振替元オーダーNO 伝票区分

1       111-01      空白        100      ←入庫発生
2       111-01      空白        200      ←データ修正発生
3       111-02      111-01       400      ←オーダー振替発生
4       111-02      空白        200      ←データ修正発生
5       111-02      空白        300      ←出庫発生

・・・このように、入庫、出庫などの作業が発生した毎にデータが作成されます。


この場合、オーダーNOは途中から 「111-01」→「111-02」に変更されてしまいますが、
オーダーNOに「111-01」を持つデータも「111-02」を持つデータも同じ荷物をあらわすデータなのです。

ですので、「同じ荷物だよ」とわかるようにしたいのです。
そして、その時は最新のオーダーNOを表示したいのです。

ストアドプロシージャも考えたのですが、
その場合、1件1件自分のオーダーNOを
振替元オーダーNOに持っているデータを探していく作業を
繰り返すことになるのでしょうか・・・・?
オーダー振替は1回とは限らないので、なんだかどうしてよいかわからなくなってしまって・・・。

いかがでしょうか?再帰クエリというのがどういうものかわかっていないので
今から調べますが、何かアドバイスがあればよろしくお願い致します。





スキルアップ/キャリアアップ(JOB@IT)