- PR -

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

投稿者投稿内容
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2007-11-09 10:20
>この場合、オーダーNOは途中から 「111-01」→「111-02」に変更されてしまいますが、
オーダーNOに「111-01」を持つデータも「111-02」を持つデータも同じ荷物をあらわすデータなのです。

ということは、
先の例でいくと、111-04、111-05は同じ荷物ではない?
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-11-09 12:02
KOXさん、有難うございます。
その通りです。111-04、111-05は違う荷物です。


忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-11-09 13:00
SQLを考えてみました。

テスト用の表定義とデータ例。

コード:
create table tbl1
(SEQ            int   primary key,
 OrderNo        char(6),
 F_OrderNo      char(6));
create index tbl1idx1 on tbl1(OrderNo);
create index tbl1idx2 on tbl1(F_OrderNo);

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',' ');
insert into tbl1 values(8,'111-04',' ');
insert into tbl1 values(9,'111-05',' ');

insert into tbl1 values(10,'111-06',' ');
insert into tbl1 values(11,'111-06',' ');
insert into tbl1 values(12,'111-07',' ');
insert into tbl1 values(13,'111-07','111-06');



検索SQL例。
長いですが、これで一つのSQLです。

コード:
with
 vtbl1(OrderNo,F_OrderNo)
  as
  (select OrderNo,max(F_OrderNo) as F_OrderNo
    from tbl1
    group by OrderNo),
 OrderSearch(OrderNo,F_OrderNo,Lvl,M_OrderNo)
  as
  (
   select OrderNo,F_OrderNo,1,OrderNo
    from vtbl1
    where F_OrderNo=' '
   union all
   select T.OrderNo,T.F_OrderNo,Lvl+1,
     OS.M_OrderNo
    from OrderSearch as OS,vtbl1 as T
    where T.F_OrderNo=OS.OrderNo
      and Lvl<5   -- 暴走の防止
  )

select
  z.SEQ,
  -- z.OrderNo,
  y.OrderNo,
  z.F_OrderNo
  -- ,
  -- x.M_OrderNo,
  -- x.OrderNo
 from OrderSearch as x,
      (select M_OrderNo,max(OrderNo) as OrderNo
        from OrderSearch
        group by M_OrderNo) as y,
      tbl1 as z
 where x.M_OrderNo=y.M_OrderNo
   and x.OrderNo=z.OrderNo
 order by z.SEQ



上記の検索SQLは、Server 2005から記述可能で、SQL-99にほぼ準拠のWITH式を使っています。
「vtbl1」は、サブクエリの結果を、それ以降の検索で利用する指定、
「OrderSearch」は、再帰クエリです。

インデクスが有効利用されるかまでは、検証していません。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-11-09 13:14
失礼。

「vtbl1」、「OrderSearch」の両方とも、再帰クエリでした。

再帰呼び出しで暴走することがないよう、

コード:
      and Lvl < 5   -- 暴走の防止



で呼び出しの深さ(今回の指定では5回未満)を制限しています。必要により、変更してください。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-11-09 16:00
忠犬さん、ご回答有難うございます。

無事、希望通りの結果を出す事が出来ました!!
解説もしていただき、感謝しています。

実はまだ、頂いたSQLの理解が出来ていないのですが、
今から、頂いたSQLの中身をひとつづつ理解していきたいと思います。
先にお礼をさせていただきます。

本当に有難うございました。

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