Sql 返回非顺序记录

Sql 返回非顺序记录,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,我有一个显示过滤记录的gridview,也就是说,主键ID中有间隙 过滤器通常应用于3列: dev_ID (nvarchar) date code_ID (nvarchar) 和一个随机的第四列,在下一次查询中将不进行过滤 选择gridview记录时 我想返回到DB并获取所选gridview记录前后的10条记录 我可以从这个例子中的PK开始 根据主键ID和其他因素,这些记录可能仍然不连续 之前可能没有10条记录,之后可能没有10条记录 新查询应返回所选记录前后的10条记录 其中dev_ID=@

我有一个显示过滤记录的gridview,也就是说,主键ID中有间隙

过滤器通常应用于3列:

dev_ID (nvarchar)
date
code_ID (nvarchar)
和一个随机的第四列,在下一次查询中将不进行过滤

选择gridview记录时

我想返回到DB并获取所选gridview记录前后的10条记录

我可以从这个例子中的PK开始

根据主键ID和其他因素,这些记录可能仍然不连续

之前可能没有10条记录,之后可能没有10条记录

新查询应返回所选记录前后的10条记录

其中dev_ID=@x,code_ID=@y和date=@someDate

当前:

我能够返回两个独立查询中所需的结果,但无法将它们合并到单个结果集

( SELECT TOP 10
            tblData.*
  FROM      tblData
  WHERE     pk <= 5481
        AND dev_ID = 'REC1'
        AND code_ID = 'FMU'
        AND CAST(event_date_time AS DATE) = '10/18/2013'
  ORDER BY  pk DESC
)
UNION
( SELECT TOP 10
            tblData.*
   FROM      tblData
  WHERE     pk >= 5481
            AND dev_ID = 'REC1'
            AND code_ID = 'FMU'
            AND CAST(event_date_time AS DATE) = '10/18/2013'
  ORDER BY  pk ASC
)
这并不返回任何记录

如何查询行号

在WHERE子句中使用粗体部分返回所需的范围

最初的努力:

WITH    recs
      AS ( SELECT TOP 1
                    *
           FROM     tblData
           WHERE    pk = GDV_PK
           ORDER BY pk
         ),
    r AS ( SELECT TOP 10
                    tblData.*
           FROM     tblData
           WHERE    dev_ID = @x
                    AND code_ID = @y
           ORDER BY PK DESC
         )
SELECT TOP 10
        *
FROM    tblData
WHERE   dev_ID = ( SELECT   dev_ID
                   FROM     r
                 )
        AND CAST(date_time AS DATE) = @someDate
ORDER BY pk

我最终提出了一个有效的解决方案,将它发布在这里,供其他可能于本周来阿克罗斯的人使用

Select * From
(SELECT TOP 10 tblData.*
FROM    tblData
WHERE   pk <= 5481 AND dev_ID = 'REC1' AND code_ID = 'FMU' AND
    CAST(event_date_time as DATE) = '10/18/2013'
UNION
SELECT  TOP 10 tblData.*
FROM    tblData
WHERE   pk >= 5481 AND dev_ID = 'REC1' AND code_ID = 'FMU' AND
    CAST(event_date_time as DATE) = '10/18/2013') A
ORDER BY pk ASC

那么tblTelematicData就是保存您想要的21条记录的表吗?抱歉,没有tblData,正在修复错误。感谢lyou的回复,但是,这似乎不起作用,UNION附近的语法不正确,并且它找不到标识pk之前10条和之后10条记录。我检查了,UNION不喜欢顺序。但我无法理解个别种类是如何不起作用的?
SELECT  TOP 10 tblData.*
    FROM    tblData
    WHERE   dev_ID = @x AND code_ID = @y and date = @someDate
    ORDER BY PK DESC
union 
SELECT  TOP 10 tblData.*
    FROM    tblData
    WHERE   dev_ID = @x AND code_ID = @y and date = @someDate
    ORDER BY PK ASC
Select * From
(SELECT TOP 10 tblData.*
FROM    tblData
WHERE   pk <= 5481 AND dev_ID = 'REC1' AND code_ID = 'FMU' AND
    CAST(event_date_time as DATE) = '10/18/2013'
UNION
SELECT  TOP 10 tblData.*
FROM    tblData
WHERE   pk >= 5481 AND dev_ID = 'REC1' AND code_ID = 'FMU' AND
    CAST(event_date_time as DATE) = '10/18/2013') A
ORDER BY pk ASC