3

Oracleで、2つのオプションのテーブルからテーブルの列を更新することは可能ですか. つまり、列がまったく同じ2つのテーブルがあり、入力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 には、レコードが異なるまったく同じ列があります。

ありがとうございました。

4

3 に答える 3

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;

終わり;

于 2012-04-26T14:36:32.450 に答える
0

なぜこの機能が必要なのか、本当に疑問に思います。私が考えることができるのは、あなたがたくさんのデータを持っていて、1つの「アーカイブ」テーブルと1つの「アクティブ」テーブルを使用してそれを分割することに決めたということだけです。

その場合、いつでも両方のテーブルを更新できます。IDが存在しない場合、何も更新されません。最初にテーブルaからidで選択し、次にaまたはbのいずれかを更新するのと同じくらい速い場合があります。パフォーマンスを向上させるために、pl/sqlブロックを使用することもできます。(必要な場合にのみ2番目のステートメントを実行します)

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;
于 2012-04-26T18:21:49.803 に答える
0

BEGIN UPDATE Table_A A SET STATUS = '0' WHERE A.ID = #ID#; if sql%notfound then
UPDATE Table_B B SET STATUS = '0' WHERE B.ID = #ID#; END IF; 終わり;

于 2012-05-04T08:49:02.727 に答える