我无法看到我在这个sql上缺少什么,选择部分工作得很好它拉了6行然后我想更新那6行。它更新了10k以上的行,我必须回滚。有人看到我错过的东西吗?
UPDATE t_ab SET uom = 3, child = 'WA'
WHERE EXISTS (SELECT q.item, q.config FROM (
SELECT distinct item, fig FROM t_ab
WHERE typ!= 'WA'
MINUS
SELECT distinct item, fig FROM t_ab
WHERE typ= 'WA') q, hand h
WHERE q.item = h.item
AND h.hand > '0'
AND q.fig <> '1')
答案 0 :(得分:0)
这是你的查询(清理了一下):
UPDATE t_ab
SET uom = 3, child = 'WA'
WHERE EXISTS (SELECT q.item, q.config
FROM (SELECT distinct item, fig
FROM t_ab
WHERE typ!= 'WA'
MINUS
SELECT distinct item, fig
FROM t_ab
WHERE typ= 'WA'
) q join
hand h
on q.item = h.item
WHERE h.hand > '0' AND q.fig <> '1'
);
根据子查询是否返回任何值,它将设置t_ab
中的所有值或者不设置任何值。
我怀疑你想要一个相关的子查询,可能是:
UPDATE t_ab
SET uom = 3, child = 'WA'
WHERE EXISTS (SELECT q.item, q.config
FROM (SELECT distinct item, config
FROM t_ab
WHERE typ!= 'WA'
MINUS
SELECT distinct item, config
FROM t_ab
WHERE typ= 'WA'
) q join
hand h
on q.item = h.item
WHERE h.hand > '0' AND q.fig <> '1' and
q.item = t_ab.item and q.config = t_ab.config
);
答案 1 :(得分:0)
您的查询存在的问题是条件WHERE EXISTS
对于t_ab
中的每一行都为真。 无连接返回基表。这几乎总是不正确的。
改为使用:
UPDATE t_ab AS t
SET uom = 3
, child = 'WA'
FROM (
SELECT distinct item, fig
FROM t_ab
WHERE typ <> 'WA' -- <> ... standard SQL (!= is accepted, too)
MINUS
SELECT distinct item, fig
FROM t_ab
WHERE typ = 'WA'
) q
JOIN hand h USING (item)
WHERE h.hand > '0'
AND q.fig <> '1'
AND t.item = q.item
AND t.fig = q.fig;
这假设您要更新t_ab
中(item, fig)
与EXISTS
半连接中已提取的行匹配的所有行,现在转换为连接表。
关键元素是连接表的WHERE
条件。 More details in the manual.