Подтвердить что ты не робот

Ошибка SQL с порядком в подзапросе

Я работаю с 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 в подзапросе?

4b9b3361

Ответ 1

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

Предложение 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

Ответ 2

Кроме того, что порядок, по-видимому, не имеет смысла в вашем запросе. Чтобы использовать порядок в подборе, вам нужно использовать 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" больше не заказывает gurantee, начиная с SQL 2005:

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

Смотрите SQL Server 2005 нарушает изменения

Надеюсь, это поможет, Патрик

Ответ 3

Если вы работаете с 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

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

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

Ответ 5

Добавьте команду "Верх" в ваш дополнительный запрос...

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

:)

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

Возможно, этот трюк поможет кому-то

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;

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

Ответ 9

Попробуйте переместить порядок по производителю вне подбора и добавьте порядок по полю в подборе



SELECT * FROM 

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

ORDER BY refKlinik_id 

Ответ 10

Для меня это решение отлично работает:

SELECT tbl.a, tbl.b
FROM (SELECT TOP (select count(1) FROM yourtable) a,b FROM yourtable order by a) tbl

Ответ 11

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

Не разрешено:

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

Разрешено:

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

Ответ 12

Добрый день

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

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

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

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

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

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

Я надеюсь, что это помогает. Спасибо вам всем

Ответ 13

Я использую этот код для получения второй зарплаты

Я тоже получаю ошибку

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

TOP 100 Я использовал, чтобы избежать ошибки

выберите * from (выберите tbl.Coloumn1, CONVERT (varchar, ROW_NUMBER() OVER (ORDER BY (SELECT 1))) AS Rowno from (выберите топ 100 * из таблицы 1 по Coloumn1 desc) в качестве tbl) в качестве tbl, где tbl.Rowno = 2

Ответ 14

Для простого подсчета, как показывает OP, Order by строго не нужен. Если они используют результат подзапроса, это может быть. Я работаю над похожей проблемой и получил ту же ошибку в следующем запросе:

- Я хочу, чтобы строки из таблицы стоимости с обновленной датой, равной максимальной обновленной дате:

    SELECT * FROM #Costs Cost
    INNER JOIN
    (
        SELECT Entityname, costtype, MAX(updatedtime) MaxUpdatedTime
        FROM #HoldCosts cost
        GROUP BY Entityname, costtype
        ORDER BY Entityname, costtype  -- *** This causes an error***
    ) CostsMax
        ON  Costs.Entityname = CostsMax.entityname
        AND Costs.Costtype = CostsMax.Costtype
        AND Costs.UpdatedTime = CostsMax.MaxUpdatedtime
    ORDER BY Costs.Entityname, Costs.costtype

- *** Для этого есть несколько вариантов:

- Добавьте постороннее предложение TOP, это похоже на хак:

    SELECT * FROM #Costs Cost
    INNER JOIN
    (
        SELECT TOP 99.999999 PERCENT Entityname, costtype, MAX(updatedtime) MaxUpdatedTime
        FROM #HoldCosts cost
        GROUP BY Entityname, costtype
        ORDER BY Entityname, costtype  
    ) CostsMax
        ON Costs.Entityname = CostsMax.entityname
        AND Costs.Costtype = CostsMax.Costtype
        AND Costs.UpdatedTime = CostsMax.MaxUpdatedtime
    ORDER BY Costs.Entityname, Costs.costtype

- **** Создайте временную таблицу для заказа maxCost

    SELECT Entityname, costtype, MAX(updatedtime) MaxUpdatedTime
    INTO #MaxCost
    FROM #HoldCosts cost
    GROUP BY Entityname, costtype
    ORDER BY Entityname, costtype  

    SELECT * FROM #Costs Cost
    INNER JOIN #MaxCost CostsMax
        ON Costs.Entityname = CostsMax.entityname
        AND Costs.Costtype = CostsMax.Costtype
        AND Costs.UpdatedTime = CostsMax.MaxUpdatedtime
    ORDER BY Costs.Entityname, costs.costtype

Другими возможными обходными путями могут быть CTE или табличные переменные. Но каждая ситуация требует от вас определить, что лучше всего подходит для вас. Я склонен смотреть в первую очередь на временную таблицу. Для меня это ясно и понятно. YMMV.

Ответ 15

На возможные потребности заказать подзапрос есть когда у вас есть UNION:

Вы генерируете телефонную книгу всех учителей и учеников.

SELECT name, phone FROM teachers
UNION
SELECT name, phone FROM students

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

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

SELECT name, phone, 1 AS orderkey FROM teachers
UNION
SELECT name, phone, 2 AS orderkey FROM students
ORDER BY orderkey, name

Я думаю, что его путь более понятен, чем фальшивый компенсирующий результат подзапроса.