从选择的结果UPDATE(UPDATE from result of SELECT)

2019-11-02 07:40发布

我有另一个表更新我表一个选择的问题。 这里是我的描述:

part具有以下字段:

part_num PK
active 
notes
weight

importedDocument具有以下字段:

part_num PK
active
notes
weight
quantity PK
condition_id  PK

part_numpart是唯一的,但part_numimportedDocument是没有的。 每part_num是在importedDocument也是part 。 我想要做的是让DISTINCT part_numimportedDocuemnt ,并用这个结果我想更新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);

我不明白为什么同样的notescondition_id设置从各地importedDocument

Answer 1:

你的问题是不完整的 。 由于可以在表中有多场比赛importedDocument在表中的一行part ,你必须定义什么在这种情况下挑选。

您的解决方案是直接在任何情况下, 错列 。 你的条件是part.part_num任何行存在importedDocument ,但各行之间没有实际联系的,所以你最终有效的CROSS JOIN (一个笛卡尔乘积 ),在每一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在这个相关的答案:
选择由组中每组第一排?

如果你不提供额外的ORDER BY到位的项目<column / expression to define which row to pick> ,查询仍然有效,但Postgres的任意决定从多个匹配挑选哪一行。



文章来源: UPDATE from result of SELECT