我有三张表代表一些地理数据的表格: - 一个与实际数据, - 一个存储街道名称, - 存储街道号码和街道名称(表格地址)之间的组合。
我已经在我的表中存在一些地址,为了在第四个表中实现INSERT INTO SELECT,我正在研究如何构建SELECT查询以仅检索地址表中尚不存在的对象。 / p>
我尝试了不同的方法,包括NOT EXISTS和id_street IS NULL条件,但我没有设法让它工作。
以下是一个示例:http://rextester.com/KMSW4349
由于
答案 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);