【问题标题】:Jet-SQL to TSQLJet-SQL 到 TSQL
【发布时间】:2016-08-18 13:15:51
【问题描述】:

在 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 查询(视图)?

【问题讨论】:

  • 我读得更仔细了。我不确定你的问题是什么。创建一个内部包含order by 的视图,或者调用一个视图并在外部包含order by。第一个不会像重复问题链接上的描述那样工作,第二个应该,但你说没有,为什么会有任何错误?
  • 令人困惑,因为您的表在名称 [dbo].[VIEW_Teile-LF-Beziehungen] 中有 VIEW 并且您的代码不包含 CREATE VIEW

标签: sql sql-server jet


【解决方案1】:

只有最外面的选择可以使用 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无论如何!

【讨论】:

  • 为什么要添加ROW_NUMBER?而不是ORDER BY COUNT([Lieferant])
  • @JuanCarlosOropeza 仅仅因为ROW_NUMBER 可以放置在 VIEW 并且会返回有保证的排序(取决于某些规则)。如上所述以及其他几个贡献:最好的方法是最外层的ORDER BY SELECT
  • 我的困惑是您是在创建视图还是从视图中选择?
  • @JuanCarlosOropeza,抱歉,这确实不清楚:这是VIEW 的查询。我将编辑我的答案。
  • 我不明白你为什么说在视图中使用row_number 会返回一个排序集?然后说你需要在外面使用order by?因为你知道 SQL 不保证任何集合的顺序。
【解决方案2】:

ORDER BY 在视图中不起作用。如果您在调用View 时不包括order by,SQL 服务器可以随意返回他想要的行

所以你需要

 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]

【讨论】:

  • 我当然知道。我的问题更多是关于 Jet-SQL 和 T-SQL 之间的区别。但是谢谢你:-)
  • 那么你应该解决一个更好的问题。仍然不确定为什么选择它作为正确答案?请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
猜你喜欢
  • 2014-07-12
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 2010-11-21
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多