PostgreSQL,不同,顺序和括号

时间:2017-12-06 01:40:29

标签: sql postgresql sql-order-by distinct

我有以下要求:

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

我无法理解何时必须使用括号,何时不使用括号。

1 个答案:

答案 0 :(得分:2)

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,可以在所有数据库中使用。