PostgreSQL,不同,排序依据和括号

PostgreSQL, distinct, order by and parentheses

我有以下要求:

select distinct m1.firstname, m1.surname 
  from cd.members as m1 
  join cd.members as m2 on m2.recommendedby = m1.memid 
  order by m1.surname, m1.firstname;

而且效果很好。但是这个:

select distinct m1.firstname, m1.surname 
  from cd.members as m1 
  join cd.members as m2 on m2.recommendedby = m1.memid 
  order by (m1.surname, m1.firstname);

给我错误:

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

我不明白什么时候必须使用括号,什么时候不需要。

Postgres 有元组composite types 的概念。这些是一起出现的标量值——很像许多编程语言中的记录或结构。

表达式可以使用元组,例如:

where (m1.surname, m1.firstname) in ( ('a', 'b'), ('x', 'y') )

您的 order by 表达式的问题是元组不在 select 中。你也可以通过使用括号来解决这个问题:

select distinct (m1.firstname, m1.surname)
from cd.members m1 join
     cd.members m2
     on m2.recommendedby = m1.memid 
order by (m1.surname, m1.firstname);

但我会坚持使用无括号的版本,这是标准的 SQL 并且适用于所有数据库。