在单个表中查询自定义排序

时间:2014-04-29 11:49:43

标签: sql-server sql-server-2005 sql-order-by

在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

正如您所看到的那样,排序首先是具有最小OFFICEIDHEADOFFICEID值为0的记录,然后立即记录保存上述记录的OFFICEID值的记录作为HEADOFFICEID,当然也按OFFICEID排序。等等..

这可以在查询中执行吗?我怀疑它是,因为关系代数在排序和分组方面具有非常广泛的能力,但无法弄清楚如何。

我知道,这个表设计可能看起来不对,但它不是我的数据库,我只需要查询它。它就像一张表中的主 - 细节关系。

1 个答案:

答案 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小提琴。