4

面试官问了我一个问题,看起来很简单,但是不知道怎么解决

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

从上面的数据来看,性别输入错误,意思是代替F应该是M,代替M应该是F。如何使用单行 sql 查询更新整个表(不要使用 pl/sql 块)。因为,如果我将一一更新性别列,则可能的错误是性别列的所有行值都变为For 或M

最终输出应该是

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

5 回答 5

3

试试这个..

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

根据 OP 请求..使用 Select 更新...

Update TableName T Set Gender=(
Select Gender from TableName B where  T.Gender!=B.Gender and rownum=1);

SQL 小提琴演示

于 2013-05-02T04:07:47.207 回答
3
update table_name
set    gender =  case when gender = 'F' then 'M' 
                      when gender = 'M' then 'F'
                  end

SQL 的工作Set theory原理是,因此更新是并行发生的,在交换两个值时,您不需要像我们在其他编程语言中所做的那样在覆盖之前存储值。

于 2013-05-02T04:53:08.730 回答
1

进行此类更新的正确方法是Amit singh 首先回答

但是如果你真的想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);

这是一个 sqlfiddle 演示

于 2013-05-02T04:33:28.037 回答
0

sql server 示例,但同样适用

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

插入@Table

选择 1,“F”

联合选择 2, 'F'

联合选择 3, 'F'

联合选择 4, 'M'

联合选择 5, 'M'

联合选择 6, 'M'

从@Table 中选择 *

更新@Table set Value = case when Value = 'F' then 'M' when Value = 'M' then 'F' else Value End

从@Table 中选择 *

于 2013-05-02T04:15:06.273 回答
0

你可以试试这个: -

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

上面的查询将匹配名称并相应地更新性别。

于 2013-05-02T06:24:08.440 回答