我通过从另一个可能有重复的表中选择将数据插入表中。我认为我的查询是通过检查行是否已经存在而处理此问题但是我遇到了一个唯一的约束违规。
以下是查询:
INSERT INTO FOLDER_USER (FOLDER_ID, USER_ID)
SELECT DECODE(FOLDERID,'F10', '1','F565','2','F11', '3','F81', '4','0'), USERID
FROM DATA1.FOLDERS F1
WHERE UPPER(OWNER) = 'ADMIN'
AND NOT EXISTS
(SELECT 1 FROM FOLDER_USER F2
WHERE DECODE(FOLDERID,'F10', '1','F565','2','F11', '3','F81', '4','0')= F2.FOLDER_ID
AND F1.USERID = F2.USER_ID);
答案 0 :(得分:3)
原因可能是对如何执行此类sql语句的误解。
首先选择所有行。然后将它们全部插入表中。这意味着您的exists子句不会看到先前由相同语句插入的行
通过查看语句,您可能会认为它插入了一行,然后像时尚一样选择循环中的下一个。事实并非如此。
答案 1 :(得分:2)
您选择的行可能并不是唯一的。
尝试:
INSERT INTO folder_user( folder_id,
user_id)
SELECT UNIQUE
DECODE( folderid, 'F10', '1', 'F565', '2', 'F11', '3', 'F81', '4', '0' ),
userid
FROM data1.folders f1
WHERE UPPER( owner ) = 'ADMIN'
AND NOT EXISTS
(SELECT 1
FROM folder_user f2
WHERE DECODE( folderid, 'F10', '1', 'F565', '2', 'F11', '3', 'F81', '4', '0' ) = f2.folder_id
AND f1.userid = f2.user_id);