0

我在使用从另一个表中选择来更新我的表时遇到问题。这是我的描述:

part有以下字段:

part_num PK
active 
notes
weight

importedDocument有以下字段:

part_num PK
active
notes
weight
quantity PK
condition_id  PK

part_numinpart是唯一的,但part_numinimportedDocument不是。里面的每一个part_num也在importedDocument里面part。我想做的是从中得到DISTINCT part_num,我想用这个结果来importedDocuemnt更新active,部分是为了所有的。notesweightpart_numimportedDocument

到目前为止,我有这个:

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.

4

1 回答 1

2

你的问题不完整。由于表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此相关答案中的更多信息:
选择每个 GROUP BY 组中的第一行?

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

于 2013-07-26T21:32:16.463 回答