Ошибка 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
в подзапросе?
Ответы
Ответ 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
Я думаю, что его путь более понятен, чем фальшивый компенсирующий результат подзапроса.