基于其他表的sql case语句更新

基于其他表的sql case语句更新,sql,oracle,Sql,Oracle,我想根据另一个表(表2)中一个或多个字段的值更新一个表(表1)。我相信这应该是一个case语句,但我不确定如何将case语句和基于另一个表的update子句合并到一个语句中。以下是迄今为止我所知道的不起作用的东西: update table1 i, table2 s set i.sales = 'F' where s.payment = 'Y' and i.order_no = s.order_no; 我知道如何基于两个表进行选择,但这不是很有帮助,因为我不想创建新的数据库对象-我只想更新现

我想根据另一个表(表2)中一个或多个字段的值更新一个表(表1)。我相信这应该是一个case语句,但我不确定如何将case语句和基于另一个表的update子句合并到一个语句中。以下是迄今为止我所知道的不起作用的东西:

update table1 i, table2 s 
set i.sales = 'F'
where s.payment = 'Y'
and i.order_no = s.order_no;
我知道如何基于两个表进行选择,但这不是很有帮助,因为我不想创建新的数据库对象-我只想更新现有对象(表1):

我知道如何在案例陈述中更新:

UPDATE  table1
SET     sales = (
                 SELECT  CASE 
                            WHEN  foo = 'X'  
                            THEN  'F'
                            ELSE  null
                           END     
                 FROM table1
                )
;
我考虑使用where子句而不是case语句,但它最终选择了每条记录,并且第二个表在payment字段中肯定有不同的值:

update t1
set sales = 'F'
where exists (select table2.payment
          from table2
          where table2.order_no = table1.order_no
          and table2.payment = 'Y');
试试这个:

update table1 i
   set i.sales = (select case when x.payment = 'Y'
                              then 'F'
                              else i.sales end
                    from table2 x
                   where x.order_no = i.order_no);

我现在没有运行oracle(因此我无法正确检查语法),但我认为您可以尝试以下方法:

update table1 i
set i.sales = 'F'
where i.order_no IN (select s.order_no from table2 s where s.payment = 'Y')

希望有帮助

当我尝试这样做时,我得到了ORA-01427:单行子查询返回多行Table1有许多列,相关的是order_no和sales。表2有很多列,相关的是订单号和付款。那么(表1和表2)之间的关系是1-N吗?因为为了完成这项工作,你必须在两者之间有一个统一。此错误说明表2中有多个注册表与表1中的一个注册表相关。因此,如果关系为1-N,则必须为表1上的每个注册表定义条件,使其与表2上的一个注册表相关
update table1 i
set i.sales = 'F'
where i.order_no IN (select s.order_no from table2 s where s.payment = 'Y')