从SELECT的结果更新

时间:2013-07-26 19:27:48

标签: sql postgresql sql-update greatest-n-per-group

我有一个问题,用另一个表中的select更新我的表。这是我的描述:

part包含以下字段:

part_num PK
active 
notes
weight

importedDocument包含以下字段:

part_num PK
active
notes
weight
quantity PK
condition_id  PK
part_num中的{p> part是唯一的,但part_num中的importedDocument不是唯一的。 part_num中的每个importedDocument也位于part中。我想要做的是从DISTINCT获取part_num importedDocuemnt,结果我要更新activenotesweight部分适用于part_num中的所有importedDocument

到目前为止,我有这个:

UPDATE part
   SET    
   active = importedDocument.active, 
   notes = importedDocument.notes,      
   weight = importedDocument.weight, 
   condition_id = importedDocument.condition_id
FROM  importedDocument
WHERE part.part_num IN (SELECT part_num from importedDocument);

我不明白为什么为notes的所有部分设置相同的condition_idimportedDocument

1 个答案:

答案 0 :(得分:2)

您的问题不完整。由于表importedDocument中表part中的单行可以存在多个匹配项,因此您必须在这种情况下定义要选择的内容。

在任何情况下,您的解决方案直接错误。您的条件是part.part_num任何行中存在importedDocument,但各行之间没有实际连接,因此最终会产生有效的CROSS JOIN(一个Cartesian product),part中的每个行都使用每个符合条件的行importedDocument进行更新(即多次!), (任意确定的)最后更新棒。昂贵的废话,绝对不是你想要的。

改为使用:

UPDATE part p
SET    active       = i.active, 
       notes        = i.notes,      
       weight       = i.weight, 
       condition_id = i.condition_id
FROM  (
   SELECT DISTINCT ON (part_num)
          part_num, active, notes, weight, condition_id
   FROM   importedDocument
   ORDER  BY part_num, <column / expression to define which row to pick>
   ) i
WHERE  p.part_num = i.part_num;

此相关答案中DISTINCT ON的更多信息:
Select first row in each GROUP BY group?

如果您不提供其他ORDER BY项代替<column / expression to define which row to pick>,则查询仍然有效,但Postgres会随意决定从多个匹配中选择哪一行。