【问题标题】:Order By in multiple Column在多列中排序
【发布时间】:2014-03-19 07:16:42
【问题描述】:

我有以下表格:

 TABLE NAME    FIELD NAMES
 t1            id,group1,group2,itemname
 t2            group1id,name
 t3            group2id,name

样本数据:

t2

   group1id      name
   1             Aa
   2             AA
   3             1AC

t3

   group2id       name
   1              BB
   2              CC

t1

   id    group1    group2    itemname
   1     1         1         Abc
   2     2         1         Bca
   3     3         2         DEC

我想根据 group1,group2 获取 itemname。我想要

在该组下的显示项目名称之后显示组名称和连字符。

所以我这样尝试:

select g1.name||'-'||g2.name grp, g1.name || ' - ' || g2.name as name from 
t2 as g1,t3 as g2,t1 i where i.group1=g1.group1id and i.group2=g2.group2id

union all

select g1.name||'-'||g2.name||'-'||itemname grp, itemname as name from 
t2 as g1,t3 as g2,t1 i where i.group1=g1.group1id and i.group2=g2.group2id
order by grp

它显示如下输出:

grp          Name

1AC-CC       1AC - CC
1AC-CC-dex   dex
Aa-BB        Aa - BB
AA-BB        AA - BB
AA-BB-Abc    Abc
Aa-BB-Bca    Bca

但我想要:

grp          Name

1AC-CC       1AC - CC
1AC-CC-dex   dex
Aa-BB        Aa - BB
Aa-BB-Bca    Bca
AA-BB        AA - BB
AA-BB-Abc    Abc

如何更改我的订单? grp 仅用于订购目的。

我正在使用 PostgreSQL 9.1。

【问题讨论】:

  • 您的查询与您给定的表不匹配。请解决您的问题。
  • 列名仍然不匹配。请考虑使用this fiddle

标签: sql postgresql sql-order-by union postgresql-9.1


【解决方案1】:

UNION 查询中,您只能按结果中的列进行排序。不过,您需要按基表中的列进行排序。

包括排序所需的列并将它们放入最后的外部SELECT。在使用过程中添加了一些其他改进。

SELECT grp, name
FROM  (
   SELECT g1.group1 || '-'   || g2.group2 AS grp
        , g1.group1 || ' - ' || g2.group2 AS name
        , g1.group1 , g2.group2  -- for sortting only
   FROM   group1 g1
   JOIN   items  i  USING (group1id)
   JOIN   group2 g2 USING (group2id)

   UNION ALL
   SELECT g1.group1 || '-' || g2.group2 || '-' || item AS grp
        , item AS name
        , g1.group1 , g2.group2  -- for sortting only
   FROM   group1 g1
   JOIN   items  i  USING (group1id)
   JOIN   group2 g2 USING (group2id)
   ) sub
ORDER  BY group1, group2;

由于grp is used for order purpose only,可以进一步简化:

SELECT name
FROM  (
   SELECT  g1.group1 || ' - ' || g2.group2 AS name
         , g1.group1 , g2.group2
   FROM   group1 g1
   JOIN   items  i  USING (group1id)
   JOIN   group2 g2 USING (group2id)

   UNION ALL
   SELECT item AS name
        , g1.group1 , g2.group2
   FROM   group1 g1
   JOIN   items  i  USING (group1id)
   JOIN   group2 g2 USING (group2id)
   ) sub
ORDER  BY group1, group2

SQL Fiddle.

【讨论】:

    【解决方案2】:

    您应该按原始列排序:

    ORDER BY t2.name, t3.name, t1.itemname
    

    但请清理您的问题。你混合表名和别名,这一切都很难阅读。一些适当的格式肯定有助于理解您的查询。

    【讨论】:

    • 如果我使用你的答案,它的显示错误missing FROM-clause entry for table "g1"
    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多