Есть ли причина, почему или почему бы вам не сделать «заказ по» в подзапросе?Является ли порядок заказа разрешенным в подзапросе
ответ
Да: Это не должно быть сделано, потому что это не имеет смысла концептуально.
Подзапрос будет использоваться в каком-то внешнем запросе (в противном случае это было бы бессмысленно), и что внешний запрос должен будет упорядочить в любом случае, так что в подзапросе нет точки, упорядочивающей подзапрос.
Это связано с тем, что в результате SQL-запроса запрос не имеет особого порядка, если вы не используете явный ORDER. Поэтому, даже если вы использовали ORDER в подзапросе, у вас нет гарантии, что это повлияет на порядок результатов внешнего запроса; так что это бессмысленно.
Конечно, это может повлиять на некоторые конкретные СУБД из-за его реализации, но это будет специфично для реализации, а не на чем-то, на что вы должны положиться.
Edit: Конечно, если вы используете TOP или LIMIT в подзапросе, вы будет нужно использовать ORDER. Но это не стандартный SQL, так или иначе ...
Вы должны использовать его, если в подзапросе используется какой-то 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
Вы можете сделать это, но я никогда не обычно, если у вас есть необходимость.
Оптимизатор будет игнорировать его (или выдаст ошибку?)
См «Intermediate materialisation» для некоторых использований.
В зависимости от размера подзапроса это будет влиять на производительность до степени размалывания.
Заказ не должен иметь значения по второму вопросу. Вы должны иметь возможность переместить часть Order By в Outer Query (это должен быть тот, который возвращает окончательные результаты).
Это абсолютно законно. То есть SELECT id FROM entries WHERE author_id IN (SELECT id FROM authors ORDER BY name DESC)
, но вы действительно получите одинаковые результаты.
Если вы используете верхний это не является полезным, поскольку вы будете заказывать во внешнем запросе в любом случае
Нет ORDER BY действует в подзапрос, когда вы заинтересованы в подмножестве всех данных, поэтому вы всегда должны a TOP
(SQL Server). Нет смысла иметь ORDER BY без TOP в подзапросе, потому что общий порядок результатов обрабатывается внешним запросом.
Вы не должны использовать его. Согласно «Art of SQL», это фактически не позволяет оптимизатору выполнять различные оптимизации, которые в противном случае могли бы сделать, потому что это досрочно трансформирует данные.
Умные люди говорят, что это не правильный/действительный способ сделать это. В моем случае SELECT TOP 100 PERCENT в подзапросе решает проблему.
Cheers
Обычно? Можете ли вы дать любой случай, когда результаты будут отличаться? – sleske
Это будет отличаться, если вы добавите инструкцию LIMIT к вашему подзапрос. В этом случае, если вы хотите увидеть все записи из 5 лучших авторов по имени, вы измените свой подзапрос на (SELECT id FROM authors ORDER BY name DESC LIMIT 5). – loginx
Правда. С TOP/LIMIT это имеет значение (и необходимо, иногда даже требуется). В противном случае это не имеет значения. – sleske