DISTINCT如何与ORDER BY交互?

时间:2016-05-16 15:37:03

标签: sql sqlite language-lawyer

考虑以下两个表:

user:
ID | name
---+--------
1  | Alice
2  | Bob
3  | Charlie

event:
order | user
------+------------
1     | 1 (Alice)
2     | 2 (Bob)
3     | 3 (Charlie)
4     | 3 (Charlie)
5     | 2 (Bob)
6     | 1 (Alice)

如果我运行以下查询:

SELECT DISTINCT user FROM event ORDER BY "order" DESC;

是否可以保证我按以下顺序得到结果?

1 (Alice)
2 (Bob)
3 (Charlie)

如果选择了event的最后三行,我知道这是我得到的顺序,因为它将按降序排序4,5,6。但是如果选择了前三行,然后DISTINCT阻止加载最后一棵树以供考虑,我会按相反的顺序得到它。

这种行为在SQL中定义得很好吗?两者中哪一个会发生?在SQLite中怎么样?

2 个答案:

答案 0 :(得分:1)

不,不能保证。
查找Itzik Ben-Gan的MS SQL逻辑查询处理阶段海报。它迁移到许多网站,目前位于https://accessexperts.com/wp-content/uploads/2015/07/Logical-Query-Processing-Poster.pdfDISTINCT位于ORDER BY .. TOP之前,Sql Server可以自由返回Alice的1 | 1 (Alice)6 | 1 (Alice)行。所以(1,2,3),(1,4,5)中的任何一个都是DISTINCT的有效结果。

答案 1 :(得分:0)

这是一个我认为可以解决您的问题的查询解决方案。

SELECT 
    MAX([order]) AS MaxOrd
  , [user]
FROM Event
GROUP BY [User]
ORDER BY MaxOrd DESC