2011-12-01 113 views
1

我正在使用版本11.2 Oracle數據庫。我需要更新表DOCUMENT_SHARING document_id的基於什麼在其他表中,正確的ID應該由其他唯一標識符選擇。一個文檔可能有多個共享,或者根本沒有。怎麼做?我卡住了。如何根據其他表中的內容更新表ID-s?

下面是表的例子:

DOCUMENT 
id | text | doc_id 
-------------------------- 
6 | foo1 | 1021 
120 | foo2 | 1123 
123 | foo3 | 1429 
121 | foo4 | 1527 
998 | foo5 | 1722 
542 | foo6 | 1923 

DOCUMENT_SHARING 
document_id | shared_to | doc_id 
-------------------------------------- 
      | human1  | 1021 
      | human2  | 1123 
      | human3  | 1429 
      | human4  | 1527 
      | human5  | 1722 
      | human6  | 1923 

我想更新表DOCUMENT_SHARING DOCUMENT_ID,這樣的結果會是這樣:

DOCUMENT_SHARING 
document_id | shared_to | doc_id 
-------------------------------------- 
6   | human1  | 1021 
120   | human2  | 1123 
123   | human3  | 1429 
121   | human4  | 1527 
998   | human5  | 1722 
542   | human6  | 1923 

我曾嘗試以下操作:

UPDATE DOCUMENT_SHARING DS SET DS.document_id = (SELECT D.ID FROM DOCUMENT D WHERE D.remote_application = 'DMS' AND D.doc_id IS NOT NULL AND D.doc_id = DS.doc_id) where DS.doc_id IS NOT NULL; 

但我得到錯誤:

Error report:
SQL Error: ORA-01407: cannot update ("SCHEMA"."DOCUMENT_SHARING"."DOCUMENT_ID") to NULL
01407. 00000 - "cannot update (%s) to NULL"

查詢 「DESCR DOCUMENT_SHARING」

Name    Null  Type   
---------------- -------- -------------- 
DOCUMENT_ID  NOT NULL NUMBER(12)  
USER_CODE  NOT NULL VARCHAR2(50)  
DOC_ID     NUMBER(12) 

回答

2

像這樣:

Update DOCUMENT_SHARING DS 
set document_id = (
    Select D.id 
    from DOCUMENT 
    where DS.doc_id = D.doc_id) 

我認爲wher你說:

UPDATE DOCUMENT_SHARING DS 
SET DS.document_id = 
    (SELECT D.ID FROM DOCUMENT D 
    WHERE D.remote_application = 'DMS' 
    AND D.doc_id IS NOT NULL AND DS.doc_id = D.doc_id) 
where DS.doc_id IS NOT NULL; 

你想說:

+0

請注意:您可以使用別名爲表方便,但在這種情況下,他們不含糊。 – danihp

+0

我不明白,你匹配doc_id和document_id,但我應該使用兩個表doc_id列匹配。 – Marko

+0

對不起@Marko,我的錯!我重寫了句子,現在用強制別名。 – danihp

0
UPDATE DOCUMENT_SHARING ds 
    SET ds.document_id = (SELECT MAX(d.id) 
          FROM DOCUMENT d 
          WHERE d.remote_application = 'DMS' 
          AND d.doc_id = ds.doc_id); 
WHERE ds.doc_id IS NOT NULL; 
+0

不工作: 錯誤起始於第3行中的命令: UPDATE DOCUMENT_SHARING DS SET ds.document_id =(SELECT d.id從文獻d WHERE d.doc_id = ds.doc_id)在命令行 錯誤:4柱: 56 錯誤報告: SQL錯誤:ORA-00904:「D」。「DOC_ID」:無效標識符 00904。00000 - 「%s:無效的標識符」 – Marko

+0

@Marko我想我犯了一個錯字,忘記將'DOCUMENT'表別名爲'd' ...我編輯了我的答案來解決這個問題。 – wweicker

0

DOCUMENT.ID空值導致的麻煩。試試這個:

UPDATE 
    (SELECT DS.document_id, D.id 
    FROM DOCUMENT_SHARING DS 
     JOIN DOCUMENT D 
     ON DS.doc_id = D.doc_id 
    WHERE D.remote_application = 'DMS' 
) tmp 
SET tmp.document_id = tmp.id 
WHERE tmp.id IS NOT NULL ; 
相關問題