【发布时间】:2019-09-22 18:13:35
【问题描述】:
我是 Postgresql 新手,我有三个表:
=# SELECT * FROM employee_names;
employee_id | employee_name
-------------+---------------
1 | Johannes
2 | Günter
3 | Elsabeth
=# SELECT * FROM projects;
employee_id | last_project
-------------+--------------
1 | 5
2 | 15
3 | 8
=# SELECT * FROM last_project_systems_used;
employee_id | last_project | systems_used
-------------+--------------+--------------
1 | 5 | 11
1 | 5 | 18
2 | 15 | 4
3 | 8 | 10
3 | 8 | 7
3 | 8 | 2
-
employee_idinemployee_names是主键和序列号。 -
employee_name是独一无二的。是的,我知道在典型的用例中,一个名字不应该被赋予独特的待遇,因为人们很容易拥有相同的名字,但在我的例子中它是独一无二的。 -
employee_idinprojects是主键。 -
last_project不是空整数,数字可以在两个表中重复(他们工作的最后一个项目的项目号) -
systems_used是唯一的(他们处理的系统编号将始终是唯一值)
总结一下:
- Johannes 的 employee_id 为 1,他的上一个项目是 #5,他在项目中同时使用了系统 11 和 18。
- Günter 的 employee_id 为 2,他的上一个项目是 #15,他在项目中同时使用了系统 4。
- Elsabeth 的 employee_id 为 3,她的上一个项目是 #8,她在项目中使用了系统 10、7 和 2。
我需要运行类似于以下内容的插入查询:
INSERT INTO last_project_systems_used
VALUES ((SELECT employee_id FROM employee_names
WHERE employee_name = 'Günter'),
(SELECT last_project FROM projects
WHERE (SELECT employee_id FROM employee_name
WHERE employee_name = 'Günter')), 9);
这将检查 Günter (2) 的employee_id 是什么,找到他的最后一个项目编号是什么 (15) 并将系统编号 9 添加到表中。
该更新如下所示:
employee_id | last_project | systems_used
-------------+--------------+--------------
1 | 5 | 11
1 | 5 | 18
2 | 15 | 4
3 | 8 | 10
3 | 8 | 7
3 | 8 | 2
2 | 15 | 9
虽然我在从名为 Günter 的员工那里获得最后一个项目编号的部分遇到问题,因为项目表中只列出了他的 ID 而不是他的名字。
任何帮助将不胜感激。
【问题讨论】:
-
您不应将
last_project存储在两个不同的表中。将其保存在projects表中。如果您需要当前last_project_systems_used格式的表格,请为该查询使用JOIN。 -
感谢@Bergi,这更优雅
标签: sql postgresql sql-update relationship sql-insert