Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
PostgreSQL 9.5仅从两个表中选择不匹配的记录_Postgresql - Fatal编程技术网

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

PostgreSQL 9.5仅从两个表中选择不匹配的记录,postgresql,Postgresql,我有三个表,代表一些地理数据和: -一个是实际数据, -一个储存街道名称的, -存储街道编号和街道名称(表地址)组合的一个 我的表中已经存在一些地址,为了在第四个表中实现插入SELECT,我正在研究如何构建SELECT查询,以仅检索地址表中尚未存在的对象 我尝试了不同的方法,包括notexists和id_street为空的条件,但我没有成功地使其工作 以下是一个例子: 谢谢您的子查询不正确。您必须与外部表匹配: INSERT INTO address(street_number,id_stree

我有三个表,代表一些地理数据和: -一个是实际数据, -一个储存街道名称的, -存储街道编号和街道名称(表地址)组合的一个

我的表中已经存在一些地址,为了在第四个表中实现插入SELECT,我正在研究如何构建SELECT查询,以仅检索地址表中尚未存在的对象

我尝试了不同的方法,包括notexists和id_street为空的条件,但我没有成功地使其工作

以下是一个例子:


谢谢

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

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街道
。好的,谢谢您的解释。在我的例子中不会发生这种情况,因为我只填充一次表。