Разрешен ли порядок по предложению в подзапросе - PullRequest
9 голосов
/ 20 января 2010

Есть ли какая-либо причина, почему или почему бы вам не сделать «заказ по» в подзапросе?

Ответы [ 9 ]

12 голосов
/ 20 января 2010

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

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

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

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

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

11 голосов
/ 20 января 2010

Вы должны использовать его, если подзапрос использует какой-то 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
3 голосов
/ 20 января 2010

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

2 голосов
/ 19 августа 2011

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

Приветствия

1 голос
/ 20 января 2010

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

1 голос
/ 20 января 2010

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

1 голос
/ 20 января 2010

В зависимости от размера подзапроса это повлияет на производительность в различной степени.

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

1 голос
/ 20 января 2010

Вы можете сделать это, но я бы не стал, если у вас нет необходимости.

Оптимизатор проигнорирует это (или выдаст ошибку?)

См. " Промежуточная материализация " для некоторых применений.

0 голосов
/ 20 января 2010

Это абсолютно законно. То есть SELECT id FROM entries WHERE author_id IN (SELECT id FROM authors ORDER BY name DESC) но обычно вы получите те же результаты.

...