oracle:更新一个非空值的列

时间:2013-12-17 09:39:30

标签: sql oracle

我想更新一个表的列:

UPDATE product prod 
SET    prod.prod_supplier_id = (SELECT s.prod_supplier_id 
                                FROM   supplier s 
                                WHERE  s.prodno = prod.prodno
                             ) 

SELECT s.prod_supplier_id FROM supplier s WHERE s.prodno = prod.prodno

不能返回null结果,如果为null,则不会进行更新 怎么做?

4 个答案:

答案 0 :(得分:4)

您还需要在WHERE子句中过滤要更新的行:

UPDATE product prod 
SET    prod.prod_supplier_id = (SELECT s.prod_supplier_id 
                                FROM   supplier s 
                                WHERE  s.prodno = prod.prodno
                             ) 
WHERE EXISTS (SELECT 42 
              FROM   supplier s2 
              WHERE  s2.prodno = prod.prodno);

使用MERGE 可能更快(假设prodnoproduct中的主键):

merge into product 
using
(
   select p.prodno,
          s.prod_supplier_id
   from product p
     join supplier s on s.prodno = p.prodno  
) t on (t.prodno = prod.prodno)
when matched then update
   set prod_supplier_id = t.prod_supplier_id;

未经过测试!

答案 1 :(得分:1)

首先创建一个备份表:

CREATE TABLE productBAK AS SELECT * FROM product;

现在你可以像这样使用更新查询:

UPDATE product prod 
SET    prod.prod_supplier_id = (SELECT s.prod_supplier_id 
                            FROM   supplier s 
                            WHERE  s.prodno = prod.prodno and
                            s.prod_supplier_id is not null
                         ) 
WHERE prod.prodno in (SELECT s1.prodno FROM supplier s1 where s1.prod_supplier_id is not null);

答案 2 :(得分:0)

WHERE子句指定应更新的记录。如果省略WHERE子句,则所有记录都将更新!

答案 3 :(得分:0)

我认为prod_supplier_id是产品和供应商的专栏。

你能解释prod_supplier_id在哪个表中不能为空吗? 查看您的查询,您需要类似

的内容
update product
set prod_supplier_id = (select prod_supplier_id 
                        from supplier 
                        where prod_supplier_id is not null);

您面临的问题:

  • 所有产品记录将使用相同的prod_supplier_id
  • 进行更新
  • 如果subselect语句返回多个记录-let表示你有5个供应商,那么5个prod_supplier_id,则更新语句将失败。

你能告诉我们:

  • 您是否希望将所有产品设置为1个供应商?
  • 如果没有,您是否有哪个产品应该包含哪个供应商?

[R