此查询返回所有项目,而不仅仅是与filtered = 'B'
匹配的项目。我必须将filtered = 'B'
放在外部WHERE
中才能正常工作。为什么这样工作?
UPDATE mytable SET status = 'A'
FROM
(
SELECT id FROM mytable
WHERE filtered = 'B' and (status = 'C' or status = 'D')
ORDER BY status NULLS LAST
LIMIT 100
FOR UPDATE
) sub
WHERE mytable.id = sub.id
RETURNING mytable.id
如何在内部查询中对其进行适当过滤?我可以将过滤器放在外部查询中,但是不清楚内部查询和外部查询中的内容,更难理解。
mytable
的主键是(id, filtered)
。
答案 0 :(得分:0)
您必须使用整个主键来联接表:
UPDATE mytable SET status = 'A'
FROM
(
SELECT id, filtered FROM mytable
WHERE filtered = 'B' and (status = 'C' or status = 'D')
ORDER BY status NULLS LAST
LIMIT 100
FOR UPDATE
) sub
WHERE (mytable.id, mytable.filtered) = (sub.id, sub.filtered)
RETURNING mytable.id;