我的程序包含以下代码:
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 EXISTS
与INSERT
合并,但我有点迷失,因为我还是SQL新手。我希望我能说清楚自己
谢谢你的帮助。
PS。 cur_ID是一个给过程的参数,它来自用户(a CREATE OR REPLACE PROCEDURE "spUpdateDonRecipRelation"(cur_ID IN NUMBER)
答案 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
表。)