Oracle SQL:我可以将同一个表上的3个查询组合成一个查询并进行复杂排序吗?

时间:2013-02-21 18:00:52

标签: sql oracle

我需要查询一个表并以复杂的排序方式获取记录。

我可以通过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个数据库之旅,以获得我想要的东西。

有什么想法吗?

史蒂夫

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聚合是必需的,因为您可能会对整组行进行排序。