题目需求很简单。
2个表:aa、bb 【为简单起见,设2张表中的所有字段均为number类型】aa:主键、状态
bb:主键、卡号、状态
bb中的主键对应于aa中的主键数据如下:
SQL> select * from aa;
 
        ID     STATUS
---------- ----------
         1        111
         2        222
         3          7
 
SQL> select * from bb;
 
        ID       CARD     STATUS
---------- ---------- ----------
         1       1000        123
         2       1001        124
         3       1002          7题目:
当卡号为1002时,将表aa和bb中的对应的status字段修改为888,即:
SQL> select * from aa;
 
        ID     STATUS
---------- ----------
         1        111
         2        222
         3        888SQL> select * from bb;
 
        ID       CARD     STATUS
---------- ---------- ----------
         1       1000        123
         2       1001        124
         3       1002        888提供测试数据:
insert into aa values(1,111);
insert into aa values(2,222);
insert into aa values(3,7);insert into bb values(1,1000,123);
insert into bb values(2,1001,124);
insert into bb values(3,1002,7);PS:想问一下,下面的update语句为何更新了3行【前两行成空了】,而不是1行呢?
SQL> update aa set status=(select 888 from bb where aa.id=bb.id and bb.card=1002);
 
3 rows updated
 
SQL> select * from aa;
 
        ID     STATUS
---------- ----------
         1 
         2 
         3        888

解决方案 »

  1.   

    update aa set status=(select 888 from bb where aa.id=bb.id and bb.card=1002) where card=1002
      

  2.   

    PS:想问一下,下面的update语句为何更新了3行【前两行成空了】,而不是1行呢? ===>
       你看一下你的update语句:
       【update aa set status=(select 888 from bb where aa.id=bb.id and bb.card=1002);】
        没有任何where条件限制,自然是全表更新,因为前两条记录在【bb.card=1002】的时候【aa.id≠bb.id】,所以关联子查询没有结果返回就是【NULL】,前两条记录既然就被更新了。
      

  3.   

    没有加限制条件啊?card号呢?哪里去了!这样的话岂不是全部更新了!对应不上的自然是空的了
      

  4.   

    --要加上限制条件,否则就更新所有表
    update aa set status=(select 888 from bb where aa.id=bb.id and bb.card=1002)
    where car=1002 
      

  5.   

    update aa set status=(select 888 from bb where aa.id=bb.id and bb.card=1002) 
    where car=1002
    建议回帖的哥们自己试下再发上来 - -0 送佛送到西嘛
      

  6.   

    update aa set status=(select status from bb where bb.card=1002)
    where id=(select id from bb where bb.card=1002)试试
      

  7.   

    运行完SQL语句后,你期望的结果是什么?问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧
      

  8.   

    update aa set status=(select 888 from bb where aa.id=bb.id and bb.card=1002); 1 对AA没做条件限制  所以 AA表中的所有status列数据都被更改
    2 bb列只有一个card为1002的  所以改了一个 “正确”的 其它没找到  自然也就是空了
      

  9.   

    1楼中报告的错误为card标示符无效。
    7楼中的语句运行后没有改变变量,即便是我将status改成888。很遗憾的是,各位写的语句都是错误的。可能是我的ps中的语句误导了大家。
    希望大家能理解题目的要求:改变2张表中status,而不是一张。
      

  10.   

      一句sql不能同时更新两张表啊!除非用存储过程!
      mysql中的update可以同时更新两张表!
      

  11.   

    我搞错了,现在改一下,7楼的可以改变,当然前提是将你的select中的status改成888,之前运行的时候不知道怎么回事,没有改变。