如何转到下一个或上一个记录

时间:2018-11-08 08:56:26

标签: sql sql-server tsql

我有一个名为INV的表,其中包含如下记录:

ID   | PROD      | WH | BRAND
200  |  0100760  | 01 |  ABC
100  |  010-1750 | 02 |  DEF
300  |  010-1750 | 01 |  SAM
4    |  1555     | 01 |  SAM 

我正在尝试使用SQL(存储过程)转到数据库表中的下一条记录。

当前我的sql是这样写的:

SELECT TOP 1 INV.*
FROM INV
WHERE INV.PROD > @prod
ORDER BY PROD ASC 

使用上述sql,当@prod为0100760时,它将转到下一条记录,其prod值为010-1750,wh值为02

当我使用上面的sql时,但是当@prod为010-1750时,它将转到prod值为1555的下一条记录。

我想将我的sql语句更改为这样的内容(我不确定):

SELECT TOP 1 INV.*
FROM INV
WHERE

IF (INV.PROD = @prod) 
 INV.PROD = @prod 
 AND INV.WH <> @wh
ELSE 
 INV.PROD > @prod

ORDER BY PROD ASC 

我认为我需要在SQL查询中使用CASE,但是我不确定如何使用。我不能使用ORDER BY ID。

让我们说我是ID为200的记录。运行存储过程时,它应该转到ID为100的记录。当我为ID 100的记录时,它应该转到ID为300的记录

3 个答案:

答案 0 :(得分:1)

进行原始查询。添加@wh以便区分大小写,并将新的ID标准添加到排序依据:

SELECT TOP 1 INV.*
FROM INV
WHERE INV.PROD > @prod or (INV.PROD=@prod and INV.WH > @wh)
ORDER BY PROD ASC,ID ASC

浏览所有评论后,我认为每种prod-wh组合都是唯一的,因此我将它们视为“要扫描的钥匙”。由于萨希尔(Sahil)的观察,我将答案的原始INV.WH <> @wh更改为INV.WH > @wh。但是请注意,如果某些行的prod和wh都相同,则将无法使用。

答案 1 :(得分:1)

您可以找到表中记录的位置,然后获取下一条记录。歧义性的主要点是列表在其记录中具有部分排序,而不是全部排序。如果我们根据(prod,id)列对记录进行排序,则只有总排序。

查看下面的代码是否有效。

SELECT TOP 1 INV.*
FROM INV
WHERE INV.PROD > @prod 
OR (
    INV.PROD=@prod 
    AND INV.ID > (SELECT ID FROM INV WHERE PROD + @prod AND WH = @wh)
    )

答案 2 :(得分:0)

以下是可能适合您的示例代码,您可以根据需要使用。使用列NextRecordID和PreviousID来获取递归中的下一条记录。

CREATE TABLE #Temp
(
    ID      INT,
    PROD    VARCHAR(100),
    WH      VARCHAR(10),
    BRAND   VARCHAR(100)
)

INSERT INTO #Temp
SELECT 200,'0100760','01','ABC' UNION
SELECT 100,'010-1750','02','DEF' UNION
SELECT 300,'010-1750','01','SAM' UNION
SELECT 4,'1555','01','SAM' 

SELECT * FROM #Temp

SELECT 
    CASE 
        WHEN 
            LEAD(ID) OVER (PARTITION BY 1 ORDER BY ID) IS NULL THEN -1 
        ELSE 
            LEAD(ID) OVER (PARTITION BY 1 ORDER BY ID) END AS NextRecordID,
     CASE 
        WHEN 
            LAG(ID) OVER (PARTITION BY 1 ORDER BY ID) IS NULL THEN -1 
        ELSE 
            LAG(ID) OVER (PARTITION BY 1 ORDER BY ID ) END AS PreviousID,
    *
FROM 
    #Temp
ORDER BY 
    ID

这是输出

enter image description here