从SELECT的多行更新

时间:2013-11-16 17:35:12

标签: sql oracle plsql

我尝试了以下查询,它使用正确的值更新了我想要的所有行。 但是有一个问题,它会将表table_destiny

上的所有其他行设置为NULL
UPDATE table_destiny t_d
SET (t_d.a, t_d.b, t_d.c) 
      =
    (SELECT a, b, c 
     FROM (SELECT DISTINCT t_d.a, t_s.a, t_s.b 
           FROM table_source t_s
           JOIN table_destiny t_d ON t_d.id = s.id) t_s
     WHERE t_s.id = t_d.id AND ROWNUM <= 1
    )
WHERE EXISTS (
  SELECT DISTINCT t_d.id
  FROM (SELECT DISTINCT t_d.a, t_s.a, t_s.b 
        FROM table_source t_s
        JOIN table_destiny t_d ON t_d.id = s.id) t_s
  WHERE t_s.id = t_d.id
);

@Thorsten_Kettner提出的解释:

在一个单独的所有者table_source,现在称为t_children,拥有我想要的数据。许多孩子在桌面t_parent,旧table_destiny上属于同一组,但他们与不相关的所有者在他们之间没有很强的关系。经过一些不同的连接,我可以到达每个孩子的父行。

所以,我得到了我想要的数据和我想要更新它们的行。

如何写一个更新说:只使用“选择”中的数据更新“此特定行”?


我正在寻找像这样answer的东西,但对于Oracle来说。

1 个答案:

答案 0 :(得分:2)

我认为您的查询是正确的,只需要稍作修改,试试这个:

UPDATE table_destiny t1
SET (t1.a, t1.b, t1.c) 
      =
    (SELECT a, b, c 
     FROM (SELECT DISTINCT t_d.a, t_s.a, t_s.b 
           FROM table_source t_s
           JOIN table_destiny t_d ON t_d.id = s.id) t2
     WHERE t2.id = t1.id AND ROWNUM <= 1
    )
WHERE EXISTS (
  SELECT DISTINCT t_d.id
  FROM (SELECT DISTINCT t_d.a, t_s.a, t_s.b 
        FROM table_source t_s
        JOIN table_destiny t_d ON t_d.id = s.id) t2
  WHERE t2.id = t1.id
);