更新存在的位置

时间:2014-02-27 03:40:05

标签: sql postgresql join sql-update

我无法看到我在这个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')

2 个答案:

答案 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.