2010-01-20 79 views

回答

12

是的:不应该这样做,因为它在概念上没有意义。

子查询将用于某些外部查询(否则它将毫无意义),并且该外部查询将必须进行排序,因此没有必要排序子查询。

这是因为SQL中的查询结果不会按特定顺序出现,除非使用明确的ORDER。因此,即使您在子查询中使用了ORDER,也无法保证这会影响外部查询结果的顺序;所以没有意义。

它可能会因为它的实现而在某些特定的RDBMS中有所作为,但这将是特定于实现的,而不是您应该依赖的。

编辑:当然,如果你在子查询使用TOP或限制,您需要使用ORDER。但是,这不是标准的SQL ......

11

如果子查询使用某种LIMIT/TOP,则应该使用它。除非子查询包含TOPFOR XML条款以及

SQL Server不会允许它:

-- Fails 
WITH q(id) AS 
     (
     SELECT 1 
     UNION ALL 
     SELECT 2 
     ) 
SELECT * 
FROM (
     SELECT * 
     FROM q 
     ORDER BY 
       id DESC 
     ) q2 

-- Succeeds 
WITH q(id) AS 
     (
     SELECT 1 
     UNION ALL 
     SELECT 2 
     ) 
SELECT * 
FROM (
     SELECT TOP 1 * 
     FROM q 
     ORDER BY 
       id DESC 
     ) q2 

-- Succeeds, but ORDER BY is ignored 
WITH q(id) AS 
     (
     SELECT 1 
     UNION ALL 
     SELECT 2 
     ) 
SELECT * 
FROM (
     SELECT TOP 100 PERCENT * 
     FROM q 
     ORDER BY 
       id DESC 
     ) q2 
1

你可以做到这一点,但我通常不会,除非你有一个需要。

优化器会忽略它(或抛出一个错误?)

请参阅“Intermediate materialisation”对于一些用途。

1

根据子查询的大小,它会影响性能对不同程度。

尽管在子查询上顺序应该没有关系。您应该能够将Order By部分移动到Outer Query(应该是返回最终结果的部分)。

-3

这是完全合法的。即SELECT id FROM entries WHERE author_id IN (SELECT id FROM authors ORDER BY name DESC),但你通常会得到相同的结果。

+0

通常?你能否给出结果会有所不同的情况? – sleske 2010-01-20 14:20:14

+0

如果您将LIMIT语句添加到子查询中,它将有所不同。在这种情况下,如果您想按名称查看前5位作者的所有条目,则可以将您的子查询更改为(SELECT ID FROM authors ORDER BY name DESC LIMIT 5)。 – loginx 2010-01-20 14:24:08

+0

是的。通过TOP/LIMIT,它会产​​生变化(并且有必要,有时甚至是必需的)。否则,它没有区别。 – sleske 2010-01-20 15:39:10

3

除非你使用上面它是没有用的,因为你将在外部查询被定购无论如何

1

没有ORDER BY是当你有兴趣在整体数据的子集的子查询有效,所以你总是需要一个TOP(SQL Server)。在子查询中没有没有TOP的ORDER BY是没有意义的,因为结果的整体排序是由外部查询处理的。

1

你不应该使用它。根据'艺术的SQL',这实际上阻止了优化器执行各种优化,否则它可以做,因为这种优先转换数据。

2

更聪明的人认为这不是正确/有效的方法。 在我的案例中,SELECT TOP 100 PERCENT在子查询中解决了这个问题。

干杯