Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将三个表连接在一起以获得一个值_Sql_Postgresql_Sql Update_Relationship_Sql Insert - Fatal编程技术网

Sql 将三个表连接在一起以获得一个值

Sql 将三个表连接在一起以获得一个值,sql,postgresql,sql-update,relationship,sql-insert,Sql,Postgresql,Sql Update,Relationship,Sql Insert,我是Postgresql新手,我有三个表: =# SELECT * FROM employee_names; employee_id | employee_name -------------+--------------- 1 | Johannes 2 | Günter 3 | Elsabeth =# SELECT * FROM projects; employee_id | last_project ----------

我是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
员工名称中的员工id是pri-key和serial。 员工名称是唯一的。是的,我知道在典型的用例中,名字不应该被给予唯一的处理,因为人们很容易有相同的名字,但在我的例子中,它是唯一的。 项目中的员工id是pri-key。 last_project不是空整数,该数字可以在两个表中重复,即他们所处理的最后一个项目的项目编号 使用的系统是唯一的。他们使用的系统编号将始终是唯一的值 总结如下:

Johannes的员工id为1,他的上一个项目是5,他在项目中同时使用了系统11和系统18。 甘特的员工id为2,他的上一个项目是15,他在项目中同时使用了系统4。 Elsabeth的员工id为3,她的上一个项目是8,她在项目中使用了系统10、7和2。 我需要运行类似以下内容的插入查询:

插入上次使用的\u项目\u系统\u 值从员工名称中选择员工id 其中员工姓名='Günter', 从项目中选择最后一个项目 其中,从员工姓名中选择员工id 其中,员工姓名='Günter',9; 这将检查Günter 2的员工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,而没有列出他的姓名

任何帮助都将不胜感激。

请使用插入。选择:

使用插入。选择:


经过足够多的尝试和错误,我发现这似乎做到了,如果有更好的解决方案,或者如果我的SQL听起来不好,请让我知道

INSERT INTO last_project_systems_used VALUES
((SELECT employee_id FROM employee_names
WHERE employee_name = 'Günter'),
(SELECT last_project FROM projects
WHERE employee_id = (SELECT employee_id FROM employee_names
WHERE employee_name = 'Günter')), 9);

经过足够多的尝试和错误,我发现这似乎做到了,如果有更好的解决方案,或者如果我的SQL听起来不好,请让我知道

INSERT INTO last_project_systems_used VALUES
((SELECT employee_id FROM employee_names
WHERE employee_name = 'Günter'),
(SELECT last_project FROM projects
WHERE employee_id = (SELECT employee_id FROM employee_names
WHERE employee_name = 'Günter')), 9);

谢谢,但我得到错误:列引用employee_id不明确第2行:选择employee_id,last_project,9,箭头指向employee_id。您可以使用USING而不是ON作为联接条件,这导致结果中只有一个employee_id列。@Bergi错误:第5行或其附近的语法错误:使用p.employee_id=en.employee_id@leetbacoon有关正确语法,请参阅:从项目中,JON employee_名称使用employee_id。或者,您可以在此处使用自然联接。@leetbacon。我本来应该对所有列引用进行限定并修复了答案。谢谢,但我得到了错误:列引用employee_id不明确第2行:选择employee_id,last_project,9,箭头指向employee_id。您可以使用USING而不是ON作为联接条件,这导致结果中只有一个employee_id列。@Bergi错误:第5行或其附近的语法错误:使用p.employee_id=en.employee_id@leetbacoon有关正确语法,请参阅:从项目中,JON employee_名称使用employee_id。或者,您可以在此处使用自然联接。@leetbacon。我本来应该对所有列引用进行限定,并修复了答案。您不应该将最后一个\u项目存储在两个不同的表中。将其保存在项目表中。如果您需要一个与当前上次使用的\u项目\u系统\u格式相同的表,请使用联接进行该查询。感谢@Bergi,这会更加优雅。您不应该将上次使用的\u项目存储在两个不同的表中。将其保存在项目表中。如果您需要一个关于当前上次使用的项目系统格式的表,请为该查询使用联接。谢谢@Bergi,这工作得更优雅是的,这听起来很糟糕,因为从employee_names(其中employee_name='Günter')复制了SELECT employee_id。为了避免在不使用联接的情况下出现这种情况,可以使用嵌套查询:INSERT INTO last_project_systems_used SELECT emloyee_id,…,9 FROM employee_names,其中employee_name='Günter',其中…部分是SELECT last_project FROM projects WHERE projects.employee_id=employee_names.employee_id。感谢您的输入。如果员工的名字被指定为唯一的,那会认为我的解决方案在功能上是合理的吗?功能上是合理的,我想是的,但代码重复仍然是不好的。不必争辩,但为什么重复的代码是不好的呢?慢一点吗?更容易打字?通常情况下是不好的做法?是的,它容易出错,而且不易维护。是的,这听起来很糟糕,因为从employee_name='Günter'中选择employee_id与employee_name重复。为了避免在不使用联接的情况下出现这种情况,可以使用嵌套查询:INSERT INTO last_project_systems_used SELECT emloyee_id,…,9 FROM employee_names,其中employee_name='Günter',其中…部分是SELECT last_project FROM projects WHERE projects.employee_id=employee_names.employee_id。感谢您的输入。如果员工名称被指定为唯一,那么我的解决方案在功能上是否合理
我想是的,但是代码复制仍然很糟糕。不用说,但是为什么重复的代码是不好的呢?慢一点吗?更容易打字?通常情况下是不好的做法?是的,它容易出错,而且不易维护。