我有以下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子句,这意味着它不一定会提供最新的条目。
如上所述,我需要使用过滤器密钥来符合项目框架的其余部分
答案 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