PostgreSQL 9.5仅从两个表中选择不匹配的记录

时间:2017-06-13 10:06:44

标签: postgresql

我有三张表代表一些地理数据的表格: - 一个与实际数据, - 一个存储街道名称, - 存储街道号码和街道名称(表格地址)之间的组合。

我已经在我的表中存在一些地址,为了在第四个表中实现INSERT INTO SELECT,我正在研究如何构建SELECT查询以仅检索地址表中尚不存在的对象。 / p>

我尝试了不同的方法,包括NOT EXISTS和id_street IS NULL条件,但我没有设法让它工作。

以下是一个示例:http://rextester.com/KMSW4349

由于

2 个答案:

答案 0 :(得分:1)

您只需使用EXCEPT删除address中已有的行:

INSERT INTO address(street_number,id_street)
   SELECT DISTINCT datas.street_number, street.id_street
   FROM datas
   LEFT JOIN street USING (street_name)
EXCEPT
   SELECT street_number, id_street FROM address;

如果address上有并发数据修改,您最终可能会重复。

为避免这种情况,您需要添加一个唯一约束并使用INSERT ... ON CONFLICT DO NOTHING

答案 1 :(得分:0)

您的子查询不正确。你必须匹配外部表:

INSERT INTO address(street_number,id_street)
SELECT DISTINCT street_number, id_street
FROM datas
LEFT JOIN street ON street.street_name=datas.street_name
WHERE NOT EXISTS (SELECT * FROM address a2 WHERE a2.street_number = datas.street_number AND a2.id_street = street.id_street);