此更新查询无法正常挂起
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的新手,所以请放轻松我。
答案 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
当某些目标行已经分配了它们的值时,最后一个谓词很有用。详细说明: