排序依据和别名 (As)

Order By and Aliases (As)

我正在解决这个 PostreSQL excercise(在 link 中你可以找到语句和数据库图)并且我得出了这个解决方案:

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

但是,我得到了以下错误

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

鉴于这一点,如您所见,所提供的解决方案与我第二次解决该问题并无太大区别,除了最后一行:虽然我要求 SQL 按引用其 [= 的列进行排序41=]s (mem.firstname, fac.name),解决方案只引用了他们的别名(member, facility),我有一些疑问:

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

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

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

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

所以,错误的原因是因为你告诉它只按 名字排序,而那个属性 必须 成为您在 SELECT 子句中所说的 DISTINCT。但它不是,它部分存在,但还有:' ' || mems.surname