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 | De ion
-----------+-----------------------------+-----------+----------+-------------------------------------+----------+--------------+-------------
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;
继续阅读与本文标签相同的文章
上一篇 :
Oracle恢复误删表以及表内的数据
-
吉利缤越,液晶仪表盘,运动座椅,L2级别自动驾驶,8秒破百
2026-05-18栏目: 教程
-
苏泊尔破壁机:技术革新 家族合力
2026-05-18栏目: 教程
-
OpenStack Train版本今日正式发布并开放下载
2026-05-18栏目: 教程
-
文在寅:八年后将韩国打造成全球第一个自动驾驶国家
2026-05-18栏目: 教程
-
Android Studio运行Hello World程序
2026-05-18栏目: 教程
