排序依据和别名 (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),我有一些疑问:
- 当我引用 table 时,ORDER BY 子句与我仅使用别名时有何不同?我认为使用列的别名不像 table 别名那样对查询有效。
- 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
我正在解决这个 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),我有一些疑问:
- 当我引用 table 时,ORDER BY 子句与我仅使用别名时有何不同?我认为使用列的别名不像 table 别名那样对查询有效。
- 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