2017-05-30 76 views
0

我似乎無法弄清楚這個Oracle的SQL代碼有什麼問題。我正在嘗試基於子查詢來更新數據庫。SQL Missing Select語句 - 更新Oracle

with T as 
(SELECT "Folder Name", SUM("Session Length") as "Folder Length" 
FROM "SESSIONUSAGE" 
GROUP BY "Folder Name") 
UPDATE FolderUsage SET ("Folder Length") = 
(SELECT "Folder Length" FROM T 
    WHERE (FolderUsage."Folder Name" = T."Folder Name") 

我需要的空間,因爲這是我如何找到數據庫。謝謝你的幫助!

+0

當您運行查詢時會發生什麼? –

+0

它最後缺少一個「)」,但它會更新所有文件夾的長度 – maSTAShuFu

回答

0

一件事,你的括號不均衡:

with T as (
     SELECT "Folder Name", SUM("Session Length") as "Folder Length" 
     FROM "SESSIONUSAGE" 
     GROUP BY "Folder Name" 
    ) 
UPDATE FolderUsage 
    SET "Folder Length" = (SELECT "Folder Length" 
          FROM T 
          WHERE FolderUsage."Folder Name" = T."Folder Name" 
         ); 

但是,甲骨文仍然不會接受這一點。所以,代之以:

UPDATE FolderUsage 
    SET "Folder Length" = (SELECT SUM(su."Session Length") 
          FROM "SESSIONUSAGE" su 
          WHERE FolderUsage."Folder Name" = su."Folder Name" 
         ); 

無論如何,我認爲這是更簡單。

2

正確的語法是

update FolderUsage 
    set "Folder Length" = 
    ( 
     with T as (<aggregate SELECT statement defining T goes here>) 
     select "Folder Length" from T where ........ 
    ) 

WITH該子句中用SELECT語句其中它是一個子查詢屬於; WITH子句不會超出UPDATE子句!

然而,在這種情況下,您可以與MERGE聲明做的更好:

merge into FolderUsage F 
    using (<aggregate SELECT statement defining T goes here>) T 
    on (F."Folder Name" = T."Folder Name") 
when matched then update set "Folder Length" = T."Folder Length"