SQL Server order by 子句不使用 top 等
Posted
技术标签:
【中文标题】SQL Server order by 子句不使用 top 等【英文标题】:SQL Server order by clause without using top etc 【发布时间】:2014-12-23 10:13:06 【问题描述】:我有以下 SQL 视图:
CREATE VIEW [dbo].[VW_ScanData]
AS
SELECT
top 10 ID,
Chip_ID,
[IPAddress] As FilterKey,
[DateTime]
FROM
TBL_ScanData WITH(NOLOCK)
ORDER BY ID DESC
GO
这个想法是返回 10 个最近的条目。我被告知要使用过滤键来检查每个 IP 地址的最近条目。
问题在于,如上所示,它将返回前 10 个条目并删除所有与过滤器键不匹配的条目,这意味着在某些情况下它不会返回任何内容。
我希望它返回给定 IP 地址的 10 个最新条目(过滤键)。
我已尝试删除“前 10 名”,但它不会接受 order by 子句,这意味着它不一定会给出最近的条目。
如前所述,我需要使用过滤键来符合项目框架的其余部分
【问题讨论】:
【参考方案1】:我建议您do not bake concerns 将行限制、排序和锁定提示添加到视图中,因为这将限制视图对不同消费者的有用性/可重用性。相反,让调用者决定这些问题,这些问题可以在使用视图时追溯应用。
如果您从视图中删除行限制,则可以从调用方完成过滤和行限制:
SELECT TOP 10 *
FROM [dbo].[VW_ScanData]
WHERE FilterKey = 'FOO'
ORDER BY ID DESC;
也就是说,除了IPAddress
的别名之外,视图并没有真正添加任何值,只是直接从表中选择:
CREATE VIEW [dbo].[VW_ScanData]
AS
SELECT
ID,
Chip_ID,
[IPAddress] As FilterKey,
[DateTime]
FROM
TBL_ScanData
GO
编辑 您可以使用的其他选项是使用存储过程或Table user defined function。后者将允许您烘焙您需要的所有关注点,并且可以将 Filter 键作为参数传递给函数:
CREATE FUNCTION [dbo].[FN_ScanData](@FilterKey VARCHAR(50))
RETURNS @Result TABLE
(
ID INT,
Chip_ID INT,
FilterKey VARCHAR(50),
[DateTime] DATETIME
)
AS
BEGIN
INSERT INTO @Result
SELECT
top 10 ID,
Chip_ID,
[IPAddress] As FilterKey,
[DateTime]
FROM
TBL_ScanData WITH(NOLOCK) -- This will bite you!
WHERE
[IPAddress] = @FilterKey
ORDER BY ID DESC
RETURN
END
然后你可以这样调用('Foo' 是你的过滤键):
SELECT *
FROM [dbo].[FN_ScanData]('FOO');
【讨论】:
我同意你所说的,但在这种情况下,有一个旧的框架设置,我可以传递给这个视图的内容有限。可能我将不得不考虑改变框架以实现我的目标 你可以在你的框架中使用用户定义的函数吗?我已经更新了一个示例。 我也不能用,我要试试改框架【参考方案2】:此选择获取每个 FilterKey 的最后 10 个条目。
select id,chip_id,FilterKey,[DateTime]
FROM (SELECT ID,
Chip_ID,
FilterKey,
[DateTime],
ROW_NUMBER() OVER (Partition By FilterKey Order BY ID DESC) AS RN
FROM TBL_ScanData WITH(NOLOCK) )
WHERE RN <= 10
【讨论】:
以上是关于SQL Server order by 子句不使用 top 等的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 查询错误 -ORDER BY 子句在视图中无效
SQL Server查询错误-ORDER BY子句在视图中无效
SQL Server 2000:在 order by 子句中选择大小写
JPA 和 SQL Server 的 ORDER BY 子句中的列无效
Sql server - 窗口函数只能出现在 SELECT 或 ORDER BY 子句中
在 Toad for Sql Server 2016 中使用带有 Union All 的 Order By 子句时出现奇怪的语法错误