2010-01-20 11 views

Respuesta

12

Sí: No debe hacerse, porque no tiene sentido conceptualmente.

La subconsulta se utilizará en algunas consultas externas (de lo contrario, no tendría sentido), y esa consulta externa tendrá que hacer el pedido de todos modos, por lo que no tiene sentido pedir la subconsulta.

Esto se debe a que los resultados de la consulta en SQL no vendrán en ningún orden particular, a menos que use un ORDEN explícito. Por lo tanto, incluso si utilizó ORDER en la subconsulta, no tiene garantía de que esto afecte el orden de los resultados de la consulta externa; así que no tiene sentido.

Por supuesto, puede hacer una diferencia en algunos RDBMS específicos debido a su implementación, pero eso será específico de la implementación, y no es algo en lo que deba confiar.

Editar: Por supuesto, si se utiliza TOP o limitar en la subconsulta, que se necesidad de utilizar el orden. Pero eso no es SQL estándar de todos modos ...

11

Debe usarlo si la subconsulta usa algún tipo de LIMIT/TOP.

SQL Server no lo permite a menos que la subconsulta contiene cláusula TOP o FOR XML así:

-- 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

usted puede hacerlo, pero no me lo general menos que tenga una necesidad.

El optimizador ignorará (o lanzar un error?)

Ver "Intermediate materialisation" para algunos usos.

1

Dependiendo del tamaño de la subconsulta, afectará el rendimiento a un grado de variación.

Sin embargo, el orden no debería importar en una sub consulta. Debería poder mover la porción Ordenar Por a la Consulta Externa (que debería ser la que devuelve los resultados finales).

-3

Es totalmente legítimo. Es decir. SELECT id FROM entries WHERE author_id IN (SELECT id FROM authors ORDER BY name DESC) pero realmente obtendrás los mismos resultados por lo general.

+0

¿Normalmente? ¿Puedes dar cualquier caso en el que los resultados difieran? – sleske

+0

Diferirá si agrega una instrucción LIMIT a su subselección. En este caso, si desea ver todas las entradas de los 5 autores principales por nombre, debe cambiar su subselección a (SELECCIONAR ID FROM autores ORDER BY nombre DESC LIMIT 5). – loginx

+0

Es cierto. Con TOP/LIMIT hace una diferencia (y es necesario, a veces incluso requerido). De lo contrario, no hace la diferencia. – sleske

3

A menos que utilice la parte superior no es útil ya que va ordenando en la consulta externa de todos modos

1

Sin ORDER BY es válido en una sub consulta cuando usted está interesado en un subconjunto de los datos globales, por lo tanto, siempre es necesario a TOP (SQL Server). No tiene sentido tener un ORDER BY sin TOP en una subconsulta porque el pedido general de los resultados es manejado por la consulta externa.

1

No debe usarlo. De acuerdo con el 'Arte de SQL', esto realmente impide que el optimizador realice varias optimizaciones que de otro modo podría hacer porque esto transforma los datos prematuramente.

2

La gente más inteligente dice que no es la forma correcta/válida para hacerlo. En mi caso SELECT TOP 100 PERCENT en la subconsulta resolvió el problema.

Cheers

Cuestiones relacionadas