1

利用可能なDBは次のとおりです。

create table tab1 (
  masterid integer(2) primary key,
  name varchar(22),
  l2 integer(2)
);

insert into tab1 values(1,'g-1',50);
insert into tab1 values(2,'g-1',50);
insert into tab1 values(3,'g-1',50);
insert into tab1 values(50,'grup1',-1);
insert into tab1 values(5,'g-1',50);
insert into tab1 values(60,'grup2',-1);
insert into tab1 values(7,'g-2',60);
insert into tab1 values(8,'g-2',60);

http://sqlfiddle.com/#!2/b7fe9/1でも入手可能

結果はグループごとになります。たとえば、行50、grup1、-1には主キーとして機能する50があり、l2列にそのmasterID(ここではケース50)がある行は、取得する必要があります。したがって、基本的に、次の出力が必要です。

MasterId    Name    l2  
   50       grup1   -1
   1        g-11    50
   2        g-12    50
   3        g-13    50
   5        g-14    50
   60       grup2   -1
   7        g-21    60
   8        g-22    60

すべてのグループのL2列の値は-1であることに注意してください。私は多くのことを試みましたが、この出力が達成できるかどうか混乱しています。あなたの助けに感謝します。ありがとうございました。

4

2 に答える 2

2

このクエリを試してください:

SELECT *
FROM tab1
-- Order records by "master id groups", first
ORDER BY CASE WHEN l2 = -1 THEN Masterid ELSE l2 END,
-- Within a "master id group", get the master first and then its children
         CASE WHEN l2 = -1 THEN 0        ELSE 1 END

オプションで、ORDER BY句にさらに式を修正して、「兄弟」を並べ替えることができます。

于 2012-09-22T09:13:47.747 に答える
0

データをグループテーブルに正規化し、l2を外部キーとして使用することをお勧めします。要求している出力が得られない場合がありますが、グループデータを使用して、データで必要な処理を実行するコードを記述できます。

create table groups (
  masterid integer(2) primary key,
  name varchar(22),
);
create table tab1 (
  masterid integer(2) primary key,
  name varchar(22),
  l2 integer(2)
);

insert into groups values(50,'grup1');
insert into groups values(60,'grup2');
insert into tab1 values(1,'g-1',50);
insert into tab1 values(2,'g-1',50);
insert into tab1 values(3,'g-1',50);
insert into tab1 values(5,'g-1',50);
insert into tab1 values(7,'g-2',60);
insert into tab1 values(8,'g-2',60);
于 2012-09-22T13:58:44.997 に答える