更新连接不起作用

时间:2015-09-15 13:41:49

标签: 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 tempimportmailer.lead_id = 0

我也尝试了以下内容,但结果不是我预期的结果,当我查看tempimportmailer表时,lead_numbers没有正确匹配。

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的新手,所以请放轻松我。

2 个答案:

答案 0 :(得分:0)

好的伙伴们在这里工作了......我在postgresql doc网站上阅读以下内容"当存在FROM子句时,实质上发生的是目标表连接到from_list中提到的表,并且连接的每个输出行表示目标表的更新操作。使用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

感谢您的所有回复。希望这有助于其他人。

答案 1 :(得分:0)

基本上你在问题中的第二个问题应该起作用(比你当前的自我回答更好) 使用表别名简化并且答案中的子查询没有任何用处,请将其删除:

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

当某些目标行已经分配了它们的值时,最后一个谓词很有用。详细说明: