我在Oracle中有两个表,定义如下:
位置数据
loc_id
capacity
loc_type
用户数据
loc_id
custom001
如果满足以下约束条件,我想要做的是将location.capacity中的内容复制到user.custom001中:
custom001<>容量
loc_type IN('A','B')
容量不是NULL或0
基于我在Stack Exchange上发现的其他一些查询,我开发了这个:
UPDATE user u
SET u.custom001 =
(SELECT l.capacity
FROM location l
WHERE u.loc_id = l.loc_id
AND l.capacity <> u.custom001
AND l.loc_type IN ('110','210')
AND l.capacity IS NOT NULL
AND l.capacity <> 0)
WHERE exists (select capacity from location l WHERE l.loc_id = u.loc_id)
但它并不尊重约束,并且正在更新用户表中的大多数行,其中大多数都是NULL。
我需要从哪里离开?
答案 0 :(得分:1)
你很亲密 以下应该有效:
UPDATE user u
SET u.custom001 = (
SELECT l.capacity
FROM location l
WHERE u.loc_id = l.loc_id
) where exists (
select null from location l
WHERE l.loc_id = u.loc_id
AND l.capacity <> u.custom001
AND l.loc_type IN ('110','210')
AND l.capacity IS NOT NULL
AND l.capacity <> 0
)
您所拥有的基本问题是您正在应用所有限制,但是由于WHERE exists
条款中不存在的限制而无论如何都要更新所有内容
答案 1 :(得分:0)
我使用这个approch并且适合我。您可以使用sql Developer生成表的ddl。然后,您可以创建具有约束的新表,例如主键,非空约束和生成的ddl中的外键。如果你的表只是没有null约束使用 将表new_table创建为(select * from old_table);