我尝试了以下查询,它使用正确的值更新了我想要的所有行。
但是有一个问题,它会将表table_destiny
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来说。
答案 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
);