我需要查询一个表并以复杂的排序方式获取记录。
我可以通过3个单独的查询得到我想要的结果,然后在用我的编程代码检索后通过强力连接结果。
我希望通过一个数据库调用数据库来恢复所有内容。
我有一个名为“委员会”的表,列出委员会名称和小组委员会名称。
committee_name subcomittee_name
-------------- -----------------
Hals Committee on Books
Hals Committee on Books Subcommittee on Paperbacks
Hals Committee on Books Subcommittee on Leather Bound Volumes
General Purpose Committee
Stans Committee on Music
Stans Committee on Music Subcommittee on CDs
Stans Committee on Music Subcommittee on MP3s
每个小组委员会都属于一个委员会。
并非所有委员会都有一个小组委员会。
每个委员会都会为小组委员会提供一个空位,以区分新的/不同的委员会
我希望得到所有的委员会和小组委员会的名字,按升序排序,但有一个转折点。我想首先列出所有“Stans”委员会,然后是Hals,然后是其他委员会。
示例:
committee_name subcomittee_name
-------------- -----------------
Stans Committee on Music
Stans Committee on Music Subcommittee on CDs
Stans Committee on Music Subcommittee on MP3s
Hals Committee on Books
Hals Committee on Books Subcommittee on Paperbacks
Hals Committee on Books Subcommittee on Leather Bound Volumes
General Purpose Committee
我可以通过3个单独的查询得到它:
select * from committee where substr(committee_name,1,1) = 'S' order by committee_name,subcommittee_name nulls first
select * from committee where substr(committee_name,1,1) = 'H' order by committee_name,subcommittee_name nulls first
select * from committee where substr(committee_name,1,1) not in ('H','S') order by committee_name,subcommittee_name nulls first
我想要的只是1个查询,1个数据库之旅,以获得我想要的东西。
有什么想法吗?
史蒂夫
答案 0 :(得分:4)
您可以先使用case
订购'S',然后再订购'H',然后再订购其他字母:
select committee_name
, subcommittee_name
from committee
group by
committee_name
, subcommittee_name
order by
case min(substring(comittee_name,1,1))
when 'S' then 1
when 'H' then 2
else 3
end
, committee_name
, subcommittee_name nulls first
min
聚合是必需的,因为您可能会对整组行进行排序。