postgresql UPDATE 起别名出现更新错误

UPDATE

环境: postgresql 10.5
redhat7.
上下文:

db1=# \d
               List of relations
 Schema |      Name      |   Type   |   Owner   
--------+----------------+----------+-----------
 public | stu_bk         | table    | wangyanru
 public | student        | table    | wangyanru
 public | student_bk     | table    | wangyanru
 public | student_id_seq | sequence | wangyanru
 public | subject        | table    | wangyanru
(5 rows)


db1=# \d+ student
                                                            Table "public.student"
  Column   |            Type             | Collation | Nullable |               Default               | Storage  | Stats target | Description 
-----------+-----------------------------+-----------+----------+-------------------------------------+----------+--------------+-------------
 id        | integer                     |           | not null | nextval('student_id_seq'::regclass) | plain    |              | 
 sid       | character varying(10)       |           |          |                                     | extended |              | 
 name      | character varying(30)       |           |          |                                     | extended |              | 
 subject   | character varying(10)       |           |          |                                     | extended |              | 
 grade     | double precision            |           |          |                                     | plain    |              | 
 test_date | timestamp without time zone |           |          |                                     | plain    |              | 
Foreign-key constraints:
    "student_subject_fkey" FOREIGN KEY (subject) REFERENCES subject(sjid)
Triggers:
    delete_student_trigger AFTER DELETE ON student FOR EACH ROW EXECUTE PROCEDURE student_delete_trigger()
    insert_student_trigger AFTER INSERT ON student FOR EACH ROW EXECUTE PROCEDURE student_insert_trigger()


db1=# select * from student;
 id | sid  |   name   | subject | grade |      test_date      
----+------+----------+---------+-------+---------------------
  4 | 1004 | 赵六     | 2       |    84 | 2018-12-17 00:28:07
  5 | 1005 | John     | 2       |    73 | 2018-12-17 00:28:07
  6 | 1006 | Prime    | 2       |    82 | 2018-12-17 00:28:07
  1 | 1001 | 张三     | 1       |    58 | 2018-12-17 00:28:07
  2 | 1002 | 李四     | 1       |   101 | 2018-12-17 00:28:07
  3 | 1003 | 王五     | 1       |    93 | 2018-12-17 00:28:07
  7 | 1007 | Mary     | 3       |   105 | 2018-12-17 00:28:07
  8 | 1008 | Jennifer | 3       |   107 | 2018-12-17 00:28:07
  9 | 1009 | Lucy     | 3       |    94 | 2018-12-17 00:28:08
 12 | 1010 | Nana     | 3       |    97 | 2018-12-18 17:51:04
(10 rows)

SQL 语句:

update student aa set aa.grade=aa.grade+10 
     from ( select bb.sid,bb.subject
               from (select a.sid ,a.subject from student a inner join subject b on a.subject=b.sjid and b.teacher='王老师') bb             
            ) cc 
 where aa.sid= cc.sid and aa.subject=cc.subject;

此语句扎一看,似乎没什么问题:
按照这个逻辑书写SQL:

UPDATE [TABLE] AS T SET T.TID=1,T.TNAME='Name',T.TClass=1 WHERE T.ID=10

其实上面SQL已经出现SQL语法错误了, 究其原因:我们平常这种书写方法是一种简写。

UPDATE T SET T.TID=1,T.TNAME='Name',T.TClass=1 FROM [TABLE] T WHERE T.ID=10

这才是规范的书写方法。

所以修改上述得SQL:

update student aa set grade=aa.grade+10 
     from ( select bb.sid,bb.subject
               from (select a.sid ,a.subject from student a inner join subject b on a.subject=b.sjid and b.teacher='王老师') bb             
            ) cc 
 where aa.sid= cc.sid and aa.subject=cc.subject;
or
update student aa set grade=grade+10 
     from ( select bb.sid,bb.subject
               from (select a.sid ,a.subject from student a inner join subject b on a.subject=b.sjid and b.teacher='王老师') bb             
            ) cc 
 where aa.sid= cc.sid and aa.subject=cc.subject;

注:UPDATE
postgresql UPDATE 起别名出现更新错误_第1张图片

你可能感兴趣的:(postgresql)