面试:使用select语句更新表值

时间:2013-05-02 04:05:56

标签: sql oracle select sql-update

采访者问我一个问题,这看起来很容易,但我想不出来,如何解决这个问题

Name  | Gender
--------------
A     | F
B     | M
C     | F
D     | F
E     | M

根据以上数据,错误地输入了性别,这意味着代替F它应该是M而代替M它应该F。如何用单行sql查询更新整个表(不要使用pl / sql块)。因为,如果我要逐个更新性别列,那么可能的错误就是性别列的所有行值都变为FM

最终输出应为

Name  | Gender
--------------
A     | M
B     | F
C     | M
D     | M
E     | F

5 个答案:

答案 0 :(得分:3)

试试这个..

Update TableName Set Gender=Case when Gender='M' Then 'F' Else 'M' end

使用Select ...

在OP请求.update上
Update TableName T Set Gender=(
Select Gender from TableName B where  T.Gender!=B.Gender and rownum=1);

SQL FIDDLE DEMO

答案 1 :(得分:3)

update table_name
set    gender =  case when gender = 'F' then 'M' 
                      when gender = 'M' then 'F'
                  end

SQL适用于Set theory原则,因此更新是并行发生的,而不是     需要临时存储来存储值,然后像我们一样覆盖     交换两个值时的其他编程语言。

答案 2 :(得分:1)

进行此类更新的正确方法是Amit singh first answered

但是如果你真的想在你的更新中有一个select statement(知道原因),那么你可以这样做:

update table1 t
set Gender = (select case when i.Gender = 'F' Then 'M' else 'F' end 
                from table1 i 
                where i.Name = t.Name);

Here is a sqlfiddle demo

答案 3 :(得分:0)

sql server示例,但同样适用

声明@Table TABLE (     Id int,     值char(1) )

插入@Table

选择1,'F'

union选择2,'F'

union选择3,'F'

union选择4,'M'

union选择5,'M'

union选择6,'M'

从@Table

中选择*

更新@Table set Value = case当Value ='F'然后'M'当Value ='M'然后'F',否则Value End

从@Table

中选择*

答案 4 :(得分:0)

你可以试试这个: -

update [table] a 
set Gender=(select case when gender='F' then 'M' else 'F' end from [table] b
where a.name=b.name)

以上查询将与名称匹配,并相应地更新性别。