2010-01-20 1 views

ответ

12

Да: Это не должно быть сделано, потому что это не имеет смысла концептуально.

Подзапрос будет использоваться в каком-то внешнем запросе (в противном случае это было бы бессмысленно), и что внешний запрос должен будет упорядочить в любом случае, так что в подзапросе нет точки, упорядочивающей подзапрос.

Это связано с тем, что в результате SQL-запроса запрос не имеет особого порядка, если вы не используете явный ORDER. Поэтому, даже если вы использовали ORDER в подзапросе, у вас нет гарантии, что это повлияет на порядок результатов внешнего запроса; так что это бессмысленно.

Конечно, это может повлиять на некоторые конкретные СУБД из-за его реализации, но это будет специфично для реализации, а не на чем-то, на что вы должны положиться.

Edit: Конечно, если вы используете TOP или LIMIT в подзапросе, вы будет нужно использовать ORDER. Но это не стандартный SQL, так или иначе ...

11

Вы должны использовать его, если в подзапросе используется какой-то LIMIT/TOP.

SQL Server не позволит, если подзапрос не содержит TOP или FOR XML положение, а также:

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

+0

Это будет отличаться, если вы добавите инструкцию LIMIT к вашему подзапрос. В этом случае, если вы хотите увидеть все записи из 5 лучших авторов по имени, вы измените свой подзапрос на (SELECT id FROM authors ORDER BY name DESC LIMIT 5). – loginx

+0

Правда. С TOP/LIMIT это имеет значение (и необходимо, иногда даже требуется). В противном случае это не имеет значения. – sleske

3

Если вы используете верхний это не является полезным, поскольку вы будете заказывать во внешнем запросе в любом случае

1

Нет ORDER BY действует в подзапрос, когда вы заинтересованы в подмножестве всех данных, поэтому вы всегда должны a TOP (SQL Server). Нет смысла иметь ORDER BY без TOP в подзапросе, потому что общий порядок результатов обрабатывается внешним запросом.

1

Вы не должны использовать его. Согласно «Art of SQL», это фактически не позволяет оптимизатору выполнять различные оптимизации, которые в противном случае могли бы сделать, потому что это досрочно трансформирует данные.

2

Умные люди говорят, что это не правильный/действительный способ сделать это. В моем случае SELECT TOP 100 PERCENT в подзапросе решает проблему.

Cheers