1

这是可用的数据库。

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 回答