我有一个问题,用另一个表中的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
,结果我要更新active
,notes
和weight
部分适用于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_id
和importedDocument
。
答案 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会随意决定从多个匹配中选择哪一行。