Ошибка SQL с Order By в подзапросе - PullRequest
62 голосов
/ 12 июня 2009

Я работаю с SQL Server 2005.

Мой запрос:

SELECT (
  SELECT COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id
) as dorduncuay

И ошибка:

Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицы, подзапросы и общие табличные выражения, если не TOP или FOR XML также указан.

Как я могу использовать ORDER BY в подзапросе?

Ответы [ 15 ]

98 голосов
/ 12 июня 2009

Это ошибка, которую вы получаете (выделение мое):

Предложение ORDER BY недопустимо в представления, встроенные функции, производные таблицы, подзапросы и общая таблица выражений, , если TOP или FOR XML не также указано.

Итак, как вы можете избежать ошибки? Я полагаю, что указав TOP, была бы одна возможность.

SELECT (
  SELECT TOP 100 PERCENT
  COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id
) as dorduncuay
33 голосов
/ 13 марта 2010

Помимо того факта, что order by не имеет смысла в вашем запросе .... Для использования заказа в суб-выборе вам необходимо использовать TOP 2147483647.

SELECT (
  SELECT TOP 2147483647
  COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id
) as dorduncuay

Насколько я понимаю, "TOP 100 PERCENT" больше не гарантирует порядок, начиная с SQL 2005:

В SQL Server 2005 ORDER BY предложение в определении представления используется только для определения строк, которые возвращается предложением TOP. Приказ Пункт BY не гарантирует заказанный результаты, когда представление запрашивается, если ORDER BY также не указан в сам запрос.

См. Изменения в SQL Server 2005

Надеюсь, это поможет, Patrick

14 голосов
/ 19 мая 2017

Если вы работаете с SQL Server 2012 или более поздней версии, это легко исправить. Добавить offset 0 rows:

SELECT (
  SELECT
  COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id OFFSET 0 ROWS
) as dorduncuay
4 голосов
/ 12 июня 2009

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

однако ваш запрос просто возвращает счетчик, поэтому я не вижу смысла заказа по.

3 голосов
/ 18 ноября 2010

может быть, этот трюк кому-нибудь поможет

SELECT
    [id],
    [code],
    [created_at]                          
FROM
    ( SELECT
        [id],
        [code],
        [created_at],
        (ROW_NUMBER() OVER (
    ORDER BY
        created_at DESC)) AS Row                                 
    FROM
        [Code_tbl]                                 
    WHERE
        [created_at] BETWEEN '2009-11-17 00:00:01' AND '2010-11-17 23:59:59'                                  
        )  Rows                          
WHERE
    Row BETWEEN 10 AND    20;

здесь внутренний подзапрос, упорядоченный по полю созданного (может быть любым из вашей таблицы)

3 голосов
/ 12 июня 2009

Добавьте команду Top к вашему подзапросу ...

SELECT 
(
SELECT TOP 100 PERCENT 
    COUNT(1) 
FROM 
    Seanslar 
WHERE 
    MONTH(tarihi) = 4
GROUP BY 
    refKlinik_id
ORDER BY 
    refKlinik_id
) as dorduncuay

:)

2 голосов
/ 12 июня 2009

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

Что касается самого вашего SQL: а) Я не видел причин для заказа, так как вы возвращаете одно значение. б) В любом случае я не вижу причин для подзапроса, поскольку вы возвращаете только одно значение.

Полагаю, здесь гораздо больше информации, которую вы, возможно, захотите сообщить нам, чтобы решить вашу проблему.

2 голосов
/ 12 июня 2009

В этом примере порядок не добавляет информации - COUNT набора одинаков для любого порядка!

Если вы выбирали что-то, что зависело от , зависит от порядка, вам нужно будет сделать одну из вещей, о которых вам сообщит сообщение об ошибке - использовать TOP или FOR XML

1 голос
/ 02 декабря 2018

Добрый день

для некоторых парней порядок в подзапросе сомнителен. Порядок в подзапросе является обязательным для использования, если вам нужно удалить некоторые записи на основе некоторой сортировки. как

delete from someTable Where ID in (select top(1) from sometable where condition order by insertionstamp desc)

так что вы можете удалить последнюю таблицу формы вставки. Есть три способа сделать это удаление на самом деле.

однако порядок во вложенном запросе может использоваться во многих случаях.

для методов удаления, использующих order by, в обзоре подзапроса по ссылке

http://web.archive.org/web/20100212155407/http://blogs.msdn.com/sqlcat/archive/2009/05/21/fast-ordered-delete.aspx

Надеюсь, это поможет. спасибо вам всем

1 голос
/ 20 октября 2016

При создании временной таблицы переместите предложение ORDER BY изнутри блока кода временной таблицы наружу.

Не допускается:

SELECT * FROM (
SELECT A FROM Y
ORDER BY Y.A
) X;

Разрешено:

SELECT * FROM (
SELECT A FROM Y
) X
ORDER BY X.A;
...