Sql 使用联接进行更新不起作用

Sql 使用联接进行更新不起作用,sql,postgresql,sql-update,Sql,Postgresql,Sql Update,此更新查询不起作用,只是挂起 UPDATE tempimportmailer ti SET lead_id = leads.id FROM leads INNER JOIN tempimportmailer ON leads.full_name = tempimportmailer.name AND leads.address = tempimportmailer.add1 AND leads.zip_code = tempimportmailer.zip WHERE tempimportma

此更新查询不起作用,只是挂起

UPDATE tempimportmailer ti
SET lead_id = leads.id
FROM leads 
INNER JOIN tempimportmailer
ON leads.full_name = tempimportmailer.name AND
leads.address = tempimportmailer.add1 AND
leads.zip_code = tempimportmailer.zip
WHERE tempimportmailer.lead_id = 0
我也尝试了以下方法,但结果与我预期的不同,在查看tempimportmailer表时,lead_编号没有正确匹配

UPDATE tempimportmailer
SET lead_id = leads.id
FROM leads 
WHERE leads.full_name = tempimportmailer.name AND leads.address = tempimportmailer.add1 AND
leads.zip_code = tempimportmailer.zip 
AND tempimportmailer.lead_id = 0;

我是新加入PostgreSQL的,所以请对我放轻松。

好了,伙计们,这就是成功的原因。。。我在postgresql文档站点上读到了以下内容:当存在FROM子句时,实际发生的是目标表被联接到FROM_列表中提到的表,联接的每个输出行表示目标表的更新操作。使用FROM时,应确保联接为要修改的每一行最多生成一个输出行。换句话说,目标行不应连接到其他表中的多个行。如果这样做,那么只有一个连接行将用于更新目标行,但使用哪一个连接行并不容易预测

由于这种不确定性,仅在子选择中引用其他表更安全,尽管通常比使用联接更难读取和更慢

我重写了代码,这似乎达到了目的:

UPDATE tempimportmailer
SET lead_id = subquery.id
FROM (SELECT id, full_name, address, zip_code FROM leads) AS subquery
WHERE tempimportmailer.lead_id = 0 AND tempimportmailer.name = subquery.full_name AND tempimportmailer.add1 = subquery.address
AND tempimportmailer.zip = subquery.zip_code

谢谢你的回复。希望这对其他人有所帮助。

基本上,问题中的第二个问题应该比当前的自我回答更有效。 使用表别名进行简化,如果答案中的子查询没有任何用处,请将其删除:

UPDATE tempimportmailer t
SET    lead_id = l.id
FROM   leads l
WHERE  t.lead_id = 0
AND    t.name = l.full_name
AND    t.add1 = l.address
AND    t.zip  = l.zip_code
AND    t.lead_id IS DISTINCT FROM l.id;  -- may be useful
当某些目标行已经具有分配给它们的值时,最后一个谓词很有用。详情:


如果不了解您的数据,或不完全匹配的内容,则很难提供帮助。从tempimportmailer中选择leads.id意味着什么,leads.full_name=tempimportmailer.name和leads.address=tempimportmailer.add1和leads.zip_code=tempimportmailer.zip和tempimportmailer.lead_id=0按leads.id分组,计数*>1;返回?您的第二个查询看起来正常。请更详细地说明没有正确匹配-确切地说是什么工作不正常?当我检查leads表时,tempimportmailer中的lead_id不正确。您不应该在FROM或JOIN子句中重复要更新的表。第二种说法肯定比第一种更正确。但是要知道哪里出了问题,你应该发布一些示例数据和预期的输出。编辑您的问题,不要在评论中发布其他信息