2011-11-22 49 views
3

我通過從另一個可能有重複的表中選擇數據插入到表中。我以爲我的查​​詢是通過檢查該行是否已經存在,但我得到一個唯一的約束違規來處理。爲什麼我在插入時違反這個唯一約束條件

下面是查詢:

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); 
  • 表FOLDER_USER包含2列FOLDER_ID(編號),USER_ID (VARCHAR)和組合時,它們構成了主鍵
  • 表文件夾包括2列FOLDERID和USERID(都是varchars)。在FOLDERID值 需要被插入到新表
+0

嘗試加入了獨特的條款,以你的SELECT中:選擇唯一DECODE(... – Ollie

+2

延是正確的'不exists'條款是沒用的,除非你已經有了解碼。值,可以按照Ollie所建議的'select unique'來使用,也可以使用'merge insert/update' – Raihan

回答

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); 
3

的原因可能是這樣一個SQL statment是如何執行的誤解之前被解碼成根據其價值 一個數字。

它首先選擇所有的行。然後將它們全部插入到表格中。這意味着您的存在子句不會看到先前由相同語句插入的行

從查看語句,您可能會覺得它插入一行,然後像循環一樣選擇下一個循環。不是這種情況。