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_NUMBER
和 OVER(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
无论如何!
在 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_NUMBER
和 OVER(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
无论如何!