在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?
Posted
技术标签:
【中文标题】在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?【英文标题】:In Oracle PL/SQL can I swap the value of the same column of two differents rows in a table when the rest of the values of the columns are equal? 【发布时间】:2019-03-29 12:09:11 【问题描述】:基本上我在为某些行赋值时弄错了。两行在除一个之外的所有列中具有相同的值,并且在该列中的值应该交换。我该如何解决这个问题?
我已经尝试了一些代码,但它仅在其他值之一不同时才有效,以便将其用作参考。但是当所有其他值都相同时,它将不起作用。
在“bar”列中,我只想交换两行的值。
foo bar foo2
1 2 4
1 3 4
【问题讨论】:
如果所有其他值都相同,那么问题出在哪里?在这里,您有一行具有值 (1, 2, 4),而另一行具有值 (1, 3, 4)。即使您确实在行之间交换 2 和 3,您仍然有两行具有值 (1, 2, 4) 和 (1, 3, 4)。换句话说,没有区别。也许更重要的是——这张桌子上的主键是什么?如果 PK=(foo, bar, foo2) 那么你不应该改变 bar 的值,因为主键是 1. Never NULL, 2. Unique, 3. Unchanged。许多人忘记或方便地忽略了最后一个限制,但是 - 好吧,你来了。 问题是如果我能够交换值,这只是一个例子,可能有一些其他列具有不同的值 【参考方案1】:您可以使用 CASE 语句来做到这一点:
update the_table
set the_column = case pk_column
when 1 then (select the_column from the_table where pk_column = 2)
when 2 then (select the_column from the_table where pk_column = 1)
end
where pk_column in (1,2);
以上假设pk_column
被定义为唯一的。
【讨论】:
我可以在 where 语句之后附加一个“and”子句来限制哪些行会受到影响吗?提前致谢以上是关于在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?的主要内容,如果未能解决你的问题,请参考以下文章