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]
Другие вопросы по тегам