【问题标题】:Order By and Aliases (As)排序方式和别名 (As)
【发布时间】:2022-01-02 03:18:37
【问题描述】:

我正在解决这个PostreSQL excercise(在链接中你可以找到语句和数据库图),我想出了这个解决方案:

SELECT mem.firstname || ' ' || mem.surname AS member, fac.name AS facility
FROM 
    cd.members mem
    INNER JOIN cd.bookings book
        ON mem.memid = book.memid
    INNER JOIN cd.facilities fac
        ON book.facid = fac.facid
WHERE
    fac.facid IN (0,1)
ORDER BY mem.firstname, fac.name

这实际上不起作用,因为我仍然会得到重复,所以我决定查看提供的解决方案:

select distinct mems.firstname || ' ' || mems.surname as member, facs.name as facility
from 
    cd.members mems
    inner join cd.bookings bks
        on mems.memid = bks.memid
    inner join cd.facilities facs
        on bks.facid = facs.facid
where
    facs.name in ('Tennis Court 2','Tennis Court 1')
order by member, facility

有了这些信息,我决定将 DISTINCT 子句添加到我的解决方案中,所以它看起来像这样:

SELECT DISTINCT(mem.firstname || ' ' || mem.surname) AS member, fac.name AS facility
FROM 
    cd.members mem
    INNER JOIN cd.bookings book
        ON mem.memid = book.memid
    INNER JOIN cd.facilities fac
        ON book.facid = fac.facid
WHERE
    fac.facid IN (0,1)
ORDER BY mem.firstname, fac.name

但是,我得到了以下错误

错误:对于 SELECT DISTINCT,ORDER BY 表达式必须出现在选择列表中 位置:313

如您所见,所提供的解决方案与我第二次处理该问题并没有太大不同,除了最后一行:虽然我要求 SQL 按引用其表的列进行排序(mem.firstname, fac.名称),解决方案只引用他们的别名(成员,设施),我有一些问题:

  1. 当我引用表与仅使用别名时,ORDER BY 子句的工作方式有何不同?我认为使用列的别名不能像表别名那样对查询起作用。
  2. DISTINCT 子句在每种情况下如何工作?

【问题讨论】:

    标签: sql postgresql inner-join distinct aliases


    【解决方案1】:

    ORDER BY mem.firstname,而解决方案使用member。这里重要的是,member 不仅包含 firstname,而且实际上包含错误消息所暗示的确切内容:

    ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list

    解释:在选择不同的值时,GROUP BY的所有表达式必须是不同的。

    所以,错误的原因是因为您告诉它按 名字排序,并且该属性 必须 是您所说的 @987654327 @ 在SELECT 子句中。但不是,它部分存在,但也有:' ' || mems.surname

    【讨论】:

    • 谢谢!我试过ORDER BY mem.firstname || ' ' || mem.surname, fac.name,它奏效了。
    • 正确,或者,因为你有:mem.firstname || ' ' || mem.surname AS member。你可以GROUP BY member 代替!这好多了,因为您不再重复它,毕竟,为什么不在创建它时使用member 呢?祝你好运! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多