从postgresql中的联合插入缺少的用户记录

时间:2014-09-11 21:02:13

标签: sql postgresql sql-update

我有三个表(usersstudentsstaff)。所有三个表共享三个共同属性(emplidfirst_namelast_name)。我希望能够在studentsstaff上建立联盟,如下所示:

SELECT emplid, first_name, last_name 
FROM students 
UNION 
SELECT emplid, first_name, last_name 
FROM staff

然后,我希望获取生成的查询,并将任何用户插入users表中,这些用户被视为“新”(在联合结果中但不在查询表中)。

我如何使用SQL(特别是PostgreSQL)实现这一目标?

INSERT INTO users (...)?

1 个答案:

答案 0 :(得分:1)

LEFT JOIN / IS NULL可能最简单:

INSERT INTO users (emplid, first_name, last_name)
SELECT sub.emplid, sub.first_name, sub.last_name
FROM (
   SELECT emplid, first_name, last_name
   FROM   students
   UNION
   SELECT emplid, first_name, last_name
   FROM   staff
   ) sub
LEFT JOIN users u2 USING (emplid, first_name, last_name)
WHERE u2.emplid IS NULL;

您可以在<{em> LEFT JOIN之前将users加入同一UPDATE的另一个实例。

我希望你这样做是为了清理所有冗余存储? (可能没有用于在多个表中保存所有这些列。)

或者,您可以在<{em> users之前从UNION查询的每一段消除UNION中的现有行。更详细,但在完全索引支持下可能更便宜,因为消除UNION的重复项会变得更便宜。

相关技术概述: