2011-11-23 35 views
0

選擇上一行和下一行我想根據當前的id從表中選擇上一行和下一行。我送電流id存儲過程和使用此查詢:使用sp

-- previous 
select top 1 id from table where id < @currentId order by id desc 
-- next 
select top 1 id from table where id < @currentId order by id asc 

問題是,當我送currentId這是在表中的最後一個ID,並要選擇下一行。然後是沒有選擇。前一行同樣的問題,當我發送currentId這是第一個id在表

是否有可能解決這個問題在沒有額外的查詢sql?

+1

解決它以什麼方式?表中最後一行後面的「下一行」應該是什麼? –

+0

當currentId是最後一行時,下一行將是同一行。同時,我創建了只返回id的sp,所以如果它什麼都不返回,那麼我不執行從表中選擇字段的第二個過程。 – davor

回答

1

編輯 - 剛剛意識到你總是希望返回兩行,再工作......

更新代碼:

SELECT * FROM @t WHERE ID = ( select top 1 id 
           from @t 
           where id < 
            case 
             when exists (select id from @t where id < @ID) 
             then @ID 
             else (@ID + 1) 
            end 
           order by id desc 
          ) 

UNION 

SELECT * FROM @t WHERE ID = ( select top 1 id 
           from @t 
           where id > 
            case 
             when exists (select id from @t where id > @ID) 
             then @ID 
             else (@ID - 1) 
            end 
           order by id 
          ) 

原件後下,我才意識到究竟你想要

你真的很接近,你需要UNION運營商和一個小的語法更改爲您的查詢。

SELECT * FROM [table] WHERE ID = (select top 1 id from @t where id < @ID order by id desc) 
UNION 
SELECT * FROM [table] WHERE ID = (select top 1 id from @t where id > @ID order by id) 

當您傳遞它的ID是第一行或最後一行時,將返回1行,否則返回2行。

測試代碼:

DECLARE @t TABLE 
(
    Id int identity, 
    Col varchar(200) 
) 

INSERT INTO @t VALUES('column one') 
INSERT INTO @t VALUES('column two') 
INSERT INTO @t VALUES('column three') 
INSERT INTO @t VALUES('column four') 
INSERT INTO @t VALUES('column five') 

DELETE FROM @t WHERE ID = 3 

DECLARE @Id int 
SET @Id = 3 -- Change this to other values to further test 

SELECT * FROM @t WHERE ID = (select top 1 id from @t where id < @ID order by id desc) 
UNION 
SELECT * FROM @t WHERE ID = (select top 1 id from @t where id > @ID order by id) 
+0

假設ID都是連續的,似乎是不安全的。如果有任何行被刪除,這將不起作用。 – hatchet

+0

@hatchet - 我注意到,在我發佈之後...檢查更新的代碼,我已經通過向我的測試代碼添加DELETE命令進行了測試。 –

2

您可以使用嵌套top。您的「下一行」案例。

SELECT TOP 1 * 
FROM (SELECT TOP 2 * 
     FROM YourTable 
     WHERE id >= @currentId 
     ORDER BY id) T 
ORDER BY id DESC 

,併爲 「上一行」

SELECT TOP 1 * 
FROM (SELECT TOP 2 * 
     FROM YourTable 
     WHERE id <= @currentId 
     ORDER BY id DESC) T 
ORDER BY id ASC