PostgreSQL 9.5仅从两个表中选择不匹配的记录
我有三个表,代表一些地理数据和: -一个是实际数据, -一个储存街道名称的, -存储街道编号和街道名称(表地址)组合的一个 我的表中已经存在一些地址,为了在第四个表中实现插入SELECT,我正在研究如何构建SELECT查询,以仅检索地址表中尚未存在的对象 我尝试了不同的方法,包括notexists和id_street为空的条件,但我没有成功地使其工作 以下是一个例子:PostgreSQL 9.5仅从两个表中选择不匹配的记录,postgresql,Postgresql,我有三个表,代表一些地理数据和: -一个是实际数据, -一个储存街道名称的, -存储街道编号和街道名称(表地址)组合的一个 我的表中已经存在一些地址,为了在第四个表中实现插入SELECT,我正在研究如何构建SELECT查询,以仅检索地址表中尚未存在的对象 我尝试了不同的方法,包括notexists和id_street为空的条件,但我没有成功地使其工作 以下是一个例子: 谢谢您的子查询不正确。您必须与外部表匹配: INSERT INTO address(street_number,id_stree
谢谢您的子查询不正确。您必须与外部表匹配:
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);
您只需使用
EXCEPT
删除地址中已有的行即可:
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;
如果在地址
上同时进行数据修改,则可能会导致重复
为了避免这种情况,您需要添加一个唯一的约束并使用INSERT。。。关于冲突,什么也不做
谢谢。您所说的“并发数据修改”是什么意思?如果有人在您的查询运行时在地址中插入一行,则后面的选择,除了
之外,还看不到新行。两次交易完成后,您有两行具有相同的街道编号
和id\u街道
。好的,谢谢您的解释。在我的例子中不会发生这种情况,因为我只填充一次表。