【发布时间】: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.名称),解决方案只引用他们的别名(成员,设施),我有一些问题:
- 当我引用表与仅使用别名时,ORDER BY 子句的工作方式有何不同?我认为使用列的别名不能像表别名那样对查询起作用。
- DISTINCT 子句在每种情况下如何工作?
【问题讨论】:
标签: sql postgresql inner-join distinct aliases