SQL Server order by子句,不使用top等

时间:2014-12-23 10:13:06

标签: sql-server view sql-order-by

我有以下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个条目。我被告知要使用filterkey检查每个IP地址的最近条目。

问题是,如上所述,它将返回前10个条目并删除所有与过滤键不匹配的条目,这意味着在某些情况下它不会返回任何内容。

我希望它返回给定IP地址(过滤器密钥)的10个最新条目。

我已尝试删除“前10名”,但它不接受order by子句,这意味着它不一定会提供最新的条目。

如上所述,我需要使用过滤器密钥来符合项目框架的其余部分

2 个答案:

答案 0 :(得分:2)

我建议您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');

答案 1 :(得分:0)

此选择获取每个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