在视图中对行进行编号

时间:2011-08-11 13:14:08

标签: sql views sql-server-2000

我使用PLC连接到SQL数据库,需要返回值列表。不幸的是,PLC的内存有限,并且一次只能检索大约5,000个值,但数据库最多可包含10,000个值。

因此我需要一种在2个操作中检索这些值的方法。不幸的是,PLC在它可以执行的查询中受到限制,并且仅限于SELECT和WHERE命令,所以我不能使用LIMIT或TOP或类似的东西。

有没有办法可以创建视图,并自动为该视图中的每个字段编号?然后我可以查询所有记录< 5,000,然后第二次查询< 10,000等?

不幸的是,似乎视图不支持标识列,因此需要手动完成。

有人有什么建议吗?我目前唯一的现实选择似乎是创建2个视图,一个是前5,000个,另一个是下一个5,000 ...

我正在使用SQL Server 2000,如果这有所不同......

3 个答案:

答案 0 :(得分:0)

有两种解决方案。最简单的方法是修改SQL表并添加IDENTITY列。如果这不可能,那么你将不得不做类似下面的查询。对于10000行,它不应该太慢。但随着桌子的增长,它会变得越来越糟糕。

SELECT        Col1, Col2, (SELECT COUNT(i.Col1) 
               FROM yourtable i 
               WHERE i.Col1 <= o.Col1) AS RowID
FROM          yourtable o

答案 1 :(得分:0)

虽然Derek提供的代码按照我的要求进行 - 即视图中每一行的编号,但是性能非常差 - 大约20秒到100行。因此,它不是一个可行的解决方案。另一种方法是将前5,000个记录编号为1,将下一个5,000记录编号为2.这可以通过3个简单查询来完成,并且执行起来要快得多。

执行此操作的代码如下:

SELECT TOP(5000) BCode, SAPCode, 1 as GroupNo FROM dbo.DB 
UNION
SELECT TOP (10000) BCode, SAPCode, 2 as GroupNo FROM dbo.DB p 
WHERE ID NOT IN (SELECT TOP(5000) ID FROM dbo.DB)

虽然正如Andriy M所指出的那样,你也应该指明一个明确的排序,以确保你不会错过任何记录。

答案 2 :(得分:0)

一种可能性是使用带有临时表的函数,例如

CREATE FUNCTION dbo.OrderedBCodeData()
RETURNS @Data TABLE (RowNumber int IDENTITY(1,1),BCode int,SAPCode int)
AS 
BEGIN
    INSERT INTO @Data (BCode,SAPCode)
    SELECT BCode,SAPCode FROM dbo.DB ORDER BY BCode

    RETURN
END

并从此功能中选择,例如

SELECT FROM dbo.OrderedBCodeData() WHERE RowNumber BETWEEN 5000 AND 10000

我从来没有在生产中使用它,事实上今天早上只是一个简单的想法,但值得探索作为一个更好的选择?