分类:
2007-12-12 14:47:51
DISTINCT
在处理完选择列表之后,生成的表可以删除重复行。 我们可以直接在 SELECT 后面写上 DISTINCT 关键字声明:
SELECT DISTINCT select_list ...
(如果不用 DISTINCT 你可以用 ALL 声明保留所有行的缺省行为。)
显然,如果两行里至少有一个列有不同的值,那么我们认为它是独立的。空值在这种考虑中认为是相同的。
另外,我们还可以用任意表达式来判断什么行可以认为是独立的:
SELECT DISTINCT ON (expression [, expression ...]) select_list ...
这里 expression 是任意值表达式, 它为所有行计算。如果一个行集合里所有行计算出的该表达式的值是一样的, 那么我们认为它们是重复的并且因此只有第一行保留在输出中。 请注意这里的一个集合的"第一行"是不可预料的, 除非你在足够多的字段上对该查询排了序,保证到达DISTINCT过滤器的行的顺序是唯一的。 (DISTINCT ON处理是发生在ORDER BY排序后面的。)
DISTINCT ON子句不是 SQL 标准的一部分, 有时候有人认为它是一个糟糕的风格,因为它的结果是不可判定的。 如果用有选择的GROUP BY和在FROM中的子查询,那么我们可以避免使用这个构造, 但是通常它是更方便的候选方法。
选摘自