Jet-SQL 到 TSQL

Jet-SQL to 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 服务器,因为 MS Access 应该只是前端。

但是在 SQL 服务器中我无法在视图中使用 ORDER。但为什么?我不明白。我想在 SQL 服务器中使用的代码:

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 服务器查询(视图)?

ORDER BY 在视图中不起作用。 SQL 如果您在调用 View

时不包含 order by,服务器可以随意 return 他想要的行

所以你需要

 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]

只有最外面的 select 可以使用 order by(但您可以声明 TOP 100 percent 来欺骗它)。因此,在 VIEW 不允许这样做是完全可以的。

许多人认为,表格有某种隐式顺序(如您所见的结果排序),但这是随机的...下一次调用可能会导致不同的排序。

还有另一种使用 ROW_NUMBEROVER(ORDER BY) 的方法。结果按此顺序交付,只要 orderby 在唯一值之后排序,就可以保证顺序。

编辑

抱歉,我的第一次尝试太快了。由于分组

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;

编辑2

这个SELECT可以放在一个VIEW,只要把你的CREATE VIEW YourViewName AS放在SELECT之前然后执行。在此之后,您将能够执行 SELECT * FROM YourViewName 以获得排序列表。

但是

正如很多地方所说:最好的是最外面的ORDER BY无论如何!