两个表如下:
PERSON{ PERSON_ID, NAME, AGE, SEX }
STUDENT{ PERSON_ID, GRADE, CLASS }
STUDENT表通过主键PERSON_ID从PERSON继承.请问: 如果我需要做以下更新, SQL该如何写效率高而且正确?
set Student.Class = 2, Student.Name = "XXX"
where Stduent.Age = 20 and Student.Grade = 1两外: 如果我对主键PERSON_ID进行更新, SQL又该如何写才能保证两个表的更新都是正确的?

解决方案 »

  1.   

    我写的SQL是:
    UPDATE PERSON
    SET NAME='XXX'
    WHERE PERSON_ID IN ( 
    SELECT PERSON.PERSON_ID 
    FROM ( SELECT PERSON_ID FROM PERSON WHERE AGE = 20 )PERSON, (SELECT PERSON_ID FROM STUDENT WHERE GRADE = 1 )STUDENT
    WHERE PERSON.PERSON_ID=STUDENT.PERSON_ID );
     
    UPDATE STUDENT
    SET CLASS=2
    WHERE PERSON_ID IN ( 
    SELECT PERSON.PERSON_ID 
    FROM ( SELECT PERSON_ID FROM PERSON WHERE AGE = 20 )PERSON, (SELECT PERSON_ID FROM STUDENT WHERE GRADE = 1 )STUDENT
    WHERE PERSON.PERSON_ID=STUDENT.PERSON_ID )可是我觉得这样的SQL效率不高, 用了IN, 而且做了两次连接子查询...另外: 如果我需要更新主键的话, 第一个SQL语句执行后就会影响第二个SQL语句, 如何才能保证正确呢?
      

  2.   

    楼住的sql应该就是如下形式:UPDATE   PERSON 
    SET   NAME= XXX ,class=2; 
    WHERE   AGE   =   20
    and exists
    (   
    SELECT  'Z'  
    FROM   STUDENT   
    WHERE   PERSON.PERSON_ID=STUDENT.PERSON_ID and GRADE   =   1  
    )
     
    还有你为什么把1个sql拆成2个sql来写.一样的条件可以更新多个数值的
      

  3.   

    5楼 你看清楚楼主的表结构
    楼主的表中,NAME 属于PERSON表,而CLASS属于STUDENT表,你写的SQL语句不能完成楼主的要求
      

  4.   

    要完成楼主的要求,只能用两条SQL语句来写.或者用过程或其它方法
      

  5.   

    update
    (select a.person_id, a.name, a.age, a.sex, b.grade, b.class 
    from person a, student b 
    where a.person_id=b.person_id 
    and a.age=20 and b.grade=1)
    set class = 2, name = 'XXX';思路就是先查询,然后更改,一条就可以。
    这种SQL的执行需要一定主键的条件,具体我不清楚。但我保证存在这种写法,我做过很多次。