2016-05-16 68 views
0

考虑下面两个表:DISTINCT如何与ORDER BY交互?

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中怎么样?

+4

使用'distinct'关键字时,您不能在'select'中使用'order by'列。我不确定您的查询是否有效。 –

+0

为什么不通过'user'而不是'order'命令? – axblount

+1

引用来自SQLite的[Order By](http://sqlite.com/lang_select.html)* Order By Clause * - “如果返回多个行的SELECT语句没有ORDER BY子句,则未定义返回行的顺序。“ – t0mm13b

回答

1

不,不会得到保证。
查找Itzik本甘的逻辑查询处理阶段MS SQL的海报。它迁移到很多网站,目前发现在https://accessexperts.com/wp-content/uploads/2015/07/Logical-Query-Processing-Poster.pdfDISTINCT优先ORDER BY .. TOP和Sql Server是免费返回任何1 | 1 (Alice)6 | 1 (Alice)行的爱丽丝。所以(1,2,3),(1,4,5)等中的任何一个都是DISTINCT的有效结果。

+0

但是,如果该通量图是正确的,则在WHERE子句之前进行评估时,任何笛卡尔连接都将永远计算。 – lvella

+0

另外,这对SQLite有效吗?你说SQL Server可以自由地返回任何。这是否意味着SQL标准将选择留给实施? SQLite对此有更强的保证吗? – lvella

+0

我手边没有标准给你直接引用,但ORDER BY是定义中最后一个操作。 – Serg

0

以下是我相信解决您的问题的查询解决方案。

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

谢谢!在另一个问题中,我特别要求解决我的问题。你可以在那里回答,我可以接受吗? https://stackoverflow.com/questions/37259972/how-to-get-the-order-distinct-rows-were-last-inserted-into-a-database – lvella