Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Sql中的表行中的两个值之间切换_Sql_Sql Server_Sql Server 2008_Sql Server 2005_Sql Server 2012 - Fatal编程技术网

如何在Sql中的表行中的两个值之间切换

如何在Sql中的表行中的两个值之间切换,sql,sql-server,sql-server-2008,sql-server-2005,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2005,Sql Server 2012,我有一个带有以下列的表名[NavBar]: Id [int] Name [nvarchar] DisplayOrder [int] 样本数据: Id Name DisplayOrder --------------------------- 1 Home 1 2 Products 2 3 Contact 3 4 Career 4 我想写一个查询来更新两行之间的显示顺序,这两行的显示顺序是给定行的下一个更高的显示顺序值 例如

我有一个带有以下列的表名[NavBar]:

Id [int]
Name [nvarchar]
DisplayOrder [int]
样本数据:

Id   Name   DisplayOrder
---------------------------
 1   Home        1
 2   Products    2
 3   Contact     3
 4   Career      4
我想写一个查询来更新两行之间的显示顺序,这两行的显示顺序是给定行的下一个更高的显示顺序值

例如,联系人=4,职业=3

预期产出:

1  Home      1
2  Products  2
3  Contact   4
4  Career    3
如何执行更新操作以在两行之间切换两个并发行的显示顺序


输入参数:仅一行的Id

尝试以下操作:

UPDATE NavBar  
SET     DisplayOrder =  CASE  
                        WHEN DisplayName  = @row1 THEN (select DipslayOrder from NavBar where DisplayName = @row2)  
                        WHEN DisplayName  = @row2 THEN (select DipslayOrder from NavBar where DisplayName = @row1) 
                        END 
WHERE   DisplayName IN (@row1, @row2);

希望这对你有用。

试试这样的方法:

UPDATE NavBar  
SET     DisplayOrder =  CASE  
                        WHEN DisplayName  = @row1 THEN (select DipslayOrder from NavBar where DisplayName = @row2)  
                        WHEN DisplayName  = @row2 THEN (select DipslayOrder from NavBar where DisplayName = @row1) 
                        END 
WHERE   DisplayName IN (@row1, @row2);

希望这对您有用。

您需要从输入和下一条记录中获取显示顺序 然后你就可以全部更新了。 这有点复杂,但我测试了它,它可以工作。 同样,这样可以避免DisplayOrder中有间隙时出现问题

declare @InputID int = 3
declare @DisplayOrderInput int
declare @ID int
declare @DisplayOrder int

select @DisplayOrderInput = DisplayOrder from NavBar where ID = @InputID

select top 1
       @ID = ID,
       @DisplayOrder = DisplayOrder
from   NavBar
where  DisplayOrder > (select DisplayOrder from NavBar where ID = @InputID)
order by DisplayOrder

update NavBar set DisplayOrder = @DisplayOrder where ID = @InputID
update NavBar set DisplayOrder = @DisplayOrderInput where ID = @ID

select * from NavBar

您需要从输入和下一条记录中获取Displayorder 然后你就可以全部更新了。 这有点复杂,但我测试了它,它可以工作。 同样,这样可以避免DisplayOrder中有间隙时出现问题

declare @InputID int = 3
declare @DisplayOrderInput int
declare @ID int
declare @DisplayOrder int

select @DisplayOrderInput = DisplayOrder from NavBar where ID = @InputID

select top 1
       @ID = ID,
       @DisplayOrder = DisplayOrder
from   NavBar
where  DisplayOrder > (select DisplayOrder from NavBar where ID = @InputID)
order by DisplayOrder

update NavBar set DisplayOrder = @DisplayOrder where ID = @InputID
update NavBar set DisplayOrder = @DisplayOrderInput where ID = @ID

select * from NavBar
试试这个-

-- 1) Get Current row's displayorder and Next Row's id in Temp table
SELECT nb1.DisplayOrder, nb2.id 
into #TempNavBar
FROM [NavBar] nb1
INNER JOIN [NavBar] nb2 ON nb1.id = nb2.id - 1
WHERE nb1.Id = 3

-- 2) Update Actual table by using Self join on Next row
UPDATE nb1
    SET nb1.DisplayOrder = nb2.DisplayOrder
FROM [NavBar] AS nb1
INNER JOIN [NavBar] AS nb2 ON nb1.id = nb2.id - 1
WHERE nb1.Id = 3

-- 3). Update Actual table by joining it with temp table
UPDATE nb1
    SET nb1.DisplayOrder = tmp2.DisplayOrder
FROM [NavBar] AS nb1
INNER JOIN #TempNavBar AS tmp2 ON nb1.id = tmp2.id

-- Cleanup operation
DROP TABLE #TempNavBar
我在这里所做的是将NavBar表本身连接到下一行id上,获取当前行的DisplayOrder列和下一行的id列值,并将其插入临时表中

在第二个查询中,我用下一行的值更新了当前行的displayOrder值

在第三个查询中,我通过将[NavBar]表与临时表连接起来,用临时表displayOrder值更新了displayOrder值

结果

试试这个-

-- 1) Get Current row's displayorder and Next Row's id in Temp table
SELECT nb1.DisplayOrder, nb2.id 
into #TempNavBar
FROM [NavBar] nb1
INNER JOIN [NavBar] nb2 ON nb1.id = nb2.id - 1
WHERE nb1.Id = 3

-- 2) Update Actual table by using Self join on Next row
UPDATE nb1
    SET nb1.DisplayOrder = nb2.DisplayOrder
FROM [NavBar] AS nb1
INNER JOIN [NavBar] AS nb2 ON nb1.id = nb2.id - 1
WHERE nb1.Id = 3

-- 3). Update Actual table by joining it with temp table
UPDATE nb1
    SET nb1.DisplayOrder = tmp2.DisplayOrder
FROM [NavBar] AS nb1
INNER JOIN #TempNavBar AS tmp2 ON nb1.id = tmp2.id

-- Cleanup operation
DROP TABLE #TempNavBar
我在这里所做的是将NavBar表本身连接到下一行id上,获取当前行的DisplayOrder列和下一行的id列值,并将其插入临时表中

在第二个查询中,我用下一行的值更新了当前行的displayOrder值

在第三个查询中,我通过将[NavBar]表与临时表连接起来,用临时表displayOrder值更新了displayOrder值

结果


输入参数应该是行的ID和您希望显示它的位置,对吗?我的意思是如果输入参数ID=3,即联系,那么我想切换到下一个显示顺序rowi.e职业,即4您所说的输入参数是什么意思:仅一行的ID??我指的是仅指定用于选择和更新的ID@KrishnrajInput参数应该是行的ID以及您希望显示它的位置,对吗?我的意思是如果输入参数ID=3,即联系,那么我想切换到下一个displayorder rowi.e职业,即4您所说的输入参数是什么意思:仅一行的ID??我是指仅指定用于选择和更新的ID@Krishnaja我如何执行这个查询?@row1、@row2或DidplayName的值是什么?如何执行此查询?@row1、@row2或DidplayName的值是什么?