Jet-SQL в TSQL
В MS Access 2010 у меня есть следующий код:
SELECT
[Teile-LF-Beziehungen].Lieferant,
COUNT([Teile-LF-Beziehungen].Lieferant) AS [Anz Teile],
First([Teile-LF-Beziehungen].Name) AS Name
FROM
[Teile-LF-Beziehungen]
GROUP BY
[Teile-LF-Beziehungen].Lieferant
ORDER BY
COUNT([Teile-LF-Beziehungen].Lieferant) DESC;
Я хочу поместить этот запрос в SQL Server, потому что MS Access должен быть только внешним интерфейсом.
Но в SQL Server я не могу использовать ORDER
в представлении. Но почему? Я не понимаю это Код, который я хочу использовать в SQL Server:
SELECT
[Lieferant],
COUNT([Lieferant]) AS [Anz Teile],
MIN([Name]) AS [Name]
FROM
[dbo].[VIEW_Teile-LF-Beziehungen]
GROUP BY
[Lieferant]
ORDER BY
COUNT([Lieferant]) DESC;
Я знаю, это не работает. Но есть ли способ вызвать запрос MS Access 1:1 к запросу SQL Server (просмотр)?
2 ответа
Только внешний выбор может использовать порядок (но вы можете указать TOP 100 percent
чтобы обмануть это). Поэтому совершенно нормально, что в VIEW это не позволяет.
Многие думают, что таблицы имеют своего рода неявный порядок (как вы видите, упорядоченный результат), но это случайно... Следующий вызов может привести к другой сортировке.
Есть еще один способ использования ROW_NUMBER
с OVER(ORDER BY)
, Результат доставляется в этом порядке, и заказ гарантируется, пока заказ сортируется по уникальным значениям.
РЕДАКТИРОВАТЬ
Извините, моя первая попытка была быстрой. ROW_NUMBER
не было разрешено из-за группировки
Это должно работать:
SELECT tbl.Lieferant
,tbl.[Anz Teile]
,tbl.Name
,ROW_NUMBER() OVER(ORDER BY tbl.[Anz Teile] DESC) AS Sort
FROM
(
SELECT [Lieferant]
,COUNT([Lieferant]) AS [Anz Teile]
,MIN([Name]) AS [Name]
FROM [dbo].[VIEW_Teile-LF-Beziehungen]
GROUP BY [Lieferant]
) AS tbl;
EDIT2
это SELECT
может быть помещен в VIEW
Поместите свой CREATE VIEW YourViewName AS
перед SELECT
и выполнить. После этого вы сможете сделать SELECT * FROM YourViewName
чтобы получить отсортированный список.
НО
Как сказано во многих местах: лучшее - это самое внешнее ORDER BY
в любом случае!
ORDER BY
не работает внутри вида. SQL-сервер может возвращать строки в любом случае, если вы не включите order by
при вызове View
Так вам нужно
SELECT *
FROM yourView
ORDER BY yourField
РЕДАКТИРОВАТЬ: я говорю, если ваш взгляд
CREATE VIEW yourView AS
SELECT
[Lieferant],
COUNT([Lieferant]) AS [Anz Teile],
MIN([Name]) AS [Name]
FROM
[dbo].[VIEW_Teile-LF-Beziehungen]
GROUP BY
[Lieferant];
Затем вы называете свой вид так
SELECT *
FROM yourView
ORDER BY [Anz Teile]