检查记录是否存在,并找出哪些列已更改

时间:2017-01-27 12:17:53

标签: sql oracle

我的程序包含以下代码:

INSERT INTO DON_RECIP_RELATION (NUMBER, ID) 
  SELECT DISTINCT (rec.NUMBER), cur_ID
  FROM REC rec, DON don
  WHERE don.NUMBER = rec.NUMBER
  ...;

这适用于插入。但是,如果我尝试更新现有记录,我会在主键上发出一个例外说明:ORA-00001: unique constraint,即ID。

我想我必须检查记录是否已经存在,然后对指定的列进行更新。但是这个表有30列或更多列,在编写sql代码时,我不知道用户试图改变哪一列。我怎样才能做到这一点。假设有一个名为NAME的列,我知道这是用户尝试更改的列,那么我可以执行以下操作:

IF EXISTS(
   SELECT ID FROM TABLE WHERE ID=cur_ID)
BEGIN
   UPDATE TABLE SET NAME = (SELECT NAME FROM TABLE WHERE ...) WHERE ID=cur_ID;
END

我需要将IF/WHEN EXISTSINSERT合并,但我有点迷失,因为我还是SQL新手。我希望我能说清楚自己 谢谢你的帮助。

PS。 cur_ID是一个给过程的参数,它来自用户(a CREATE OR REPLACE PROCEDURE "spUpdateDonRecipRelation"(cur_ID IN NUMBER)

1 个答案:

答案 0 :(得分:1)

首先,您仍然可以从select获得重复项。 distinct并不能阻止这种情况发生。我建议:

SELECT MAX(rec.NUMBER), cur_ID
FROM REC rec JOIN
     DON don
     ON don.NUMBER = rec.NUMBER
GROUP BY cur_id;

然后,您可以将检查放入WHERE子句:

INSERT INTO DON_RECIP_RELATION (NUMBER, ID) 
    SELECT MAX(rec.NUMBER), don.cur_ID
    FROM REC rec JOIN
         DON don
         ON don.NUMBER = rec.NUMBER
    WHERE NOT EXISTS (SELECT 1 FROM DON_RECIP_RELATION drr WHERE drr.ID= don.cur_ID)
    GROUP BY don.cur_id;

(我猜测cur_id来自don表。)