使用Case时从两个表更新语句

时间:2012-04-26 14:27:57

标签: sql oracle plsql sql-update plsqldeveloper

是否可以在Oracle中从两个可选表更新表的列。我的意思是,有两个表的列完全相同,根据输入ID,我想更新相关的表。 例如。

UPDATE CASE WHEN EXISTS (
    SELECT A.ID FROM Table_A A 
    WHERE  A.ID = 'B1'
    )
    THEN
      Table_A A 
      SET A.Status = '0'
      WHERE A.ID = 'B1'
    ELSE
      Table_B B
      SET B.Status = '0'
      WHERE B.ID = 'B1'

Table_A和Table_B具有完全相同的列,具有不同的记录。

谢谢。

3 个答案:

答案 0 :(得分:1)

我不认为单个语句可以实现,但您可以使用PL / SQL实现它:

declare
VarCount number;

begin

SELECT  COUNT(*)
INTO    VarCount
FROM    Table_A
WHERE   ID = 'B1';

IF  VarCount > 1  THEN
    UPDATE  Table_A
    SET     Status = '0'
    WHERE   ID = 'B1';
ELSE
    UPDATE  Table_B
    SET     Status = '0'
    WHERE   ID = 'B1';
END IF;

端;

答案 1 :(得分:0)

我真的很想知道为什么你会想要这个功能。我能想到的只是你拥有大量数据,并决定使用1个“存档”表和1个“活动”表将其拆分。

在这种情况下,您可以随时更新两个表。如果id不存在,则不会更新任何内容。它可能与首先从表a中选择id一样快,然后更新a或b。 您还可以使用pl / sql块来获得更好的性能。 (它只会在必要时执行第二个声明)

create or replace procedure update_table(p_id in table_a.id%type)
as
begin
    update table_a
    set    status = 0
    where  id = p_id;

    -- only update table_b if table_a didn't update anything
    if sql%rowcount == 0 then
        update table_b
        set    status = 0
        where  id = p_id;
    end if;
end;

答案 2 :(得分:0)

BEGIN   UPDATE Table_A SET STATUS ='0'WHERE A.ID =#ID#;     如果sql%notfound那么
    UPDATE Table_B B SET STATUS ='0'WHERES B.ID =#ID#;     万一; END;