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 子句时出现奇怪的语法错误