0

我在 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。

我需要从这里去哪里?

4

2 回答 2

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条款中不存在限制,因此无论如何都要更新所有内容

于 2013-11-13T21:49:04.227 回答
0

我使用这种方法并且对我很有效。可以使用sql Developer生成表的ddl。然后,您可以从生成的 ddl 创建具有约束的新表,例如主键、非空约束和外键。如果您的表只是不是空约束,请使用 Create table new_table as (select * from old_table);

于 2014-05-28T10:16:23.500 回答