在MS SQL Server 2005中,我有以下表格:
CREATE TABLE OFFICES(
OFFICEID INT NOT NULL,
OFFICENAME VARCHAR(100),
HEADOFFICEID INT
)
INSERT INTO OFFICES VALUES(1,'Germany',0);
INSERT INTO OFFICES VALUES(2,'France',0);
INSERT INTO OFFICES VALUES(3,'USA',0);
INSERT INTO OFFICES VALUES(115,'Berlin',1);
INSERT INTO OFFICES VALUES(116,'Munich',1);
INSERT INTO OFFICES VALUES(117,'Cologne',1);
INSERT INTO OFFICES VALUES(118,'Lyon',2);
INSERT INTO OFFICES VALUES(119,'Marseille',2);
INSERT INTO OFFICES VALUES(120,'Paris',2);
INSERT INTO OFFICES VALUES(121,'San Francisco',3);
INSERT INTO OFFICES VALUES(122,'Boston',3);
INSERT INTO OFFICES VALUES(123,'Houston',3);
为了更好地表达我想要的结果,我需要SELECT * FROM query
返回结果:
OFFICEID | OFFICENAME | HEADOFFICEID
-------- ---------- ------------
1 Germany 0
115 Berlin 1
116 Munich 1
117 Cologne 1
2 France 0
118 Lyon 2
119 Marseille 2
120 Paris 2
3 USA 0
121 San Francisco 3
122 Boston 3
123 Houston 3
正如您所看到的那样,排序首先是具有最小OFFICEID
且HEADOFFICEID
值为0的记录,然后立即记录保存上述记录的OFFICEID
值的记录作为HEADOFFICEID
,当然也按OFFICEID
排序。等等..
这可以在查询中执行吗?我怀疑它是,因为关系代数在排序和分组方面具有非常广泛的能力,但无法弄清楚如何。
我知道,这个表设计可能看起来不对,但它不是我的数据库,我只需要查询它。它就像一张表中的主 - 细节关系。
答案 0 :(得分:1)
我认为您想要的逻辑是由总公司或总公司的办公室ID订购。剩下的就是将总公司放在首位,其余的是officeid
。您可以使用case
子句中的order by
完成所有这些操作:
select *
from offices o
order by (case when headofficeid = 0 then officeid else headofficeid end),
(case when headofficeid = 0 then 1 else 2 end),
officeid;
Here是结果的SQL小提琴。