如何在sql中获得此结果?

时间:2012-09-22 09:07:04

标签: sql

这是可用的数据库。

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值。 我尝试了很多东西,但我很困惑,这个输出可以实现或不实现。我将非常感谢你的帮助。谢谢。

2 个答案:

答案 0 :(得分: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子句,以命令“兄弟姐妹”

答案 1 :(得分: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);