2014-09-22 23 views
0
UPDATE element e1 SET e1.line_number = 
    (
     SELECT t.r FROM 
     (
      select ele,rownum r from 
      ( 
       select   nvl(par.SEQUENCE,ch.SEQUENCE),ch.SEQUENCE,nvl2(par.SEQUENCE,ch.SEQUENCE,0),ch.element_id ele 
       from element par right join element ch on par.element_id=ch.parent_element_id 
       where ch.document_id = 78384 order by 1,3,2 
      ) 
     ) t ,element e1 
     WHERE e1.element_id = t.ele 

    ) WHERE e1.document_id = 78384; 
+0

根據'nvl()'的用法增加了'oracle'標籤。 – 2014-09-22 07:10:54

+0

這有一個可怕的O(n2)性能。如果您提供了創建腳本,示例數據和預期輸出,我們可以向您展示如何使用O(n)性能實現。 – 2014-09-22 10:35:49

回答

0

我不能直接提供您請求的答案,而是給出一些提示,這可以幫助你:

  • 首先,你應該給我們一些關於你的用例的提示。人們可能會猜測你的陳述中發生了什麼,但如果你描述了你有什麼和你需要什麼,那麼幫助你就容易多了。
  • 你有3個級聯select s,這通常不是最好的主意。另外,你在內部選擇中有一個order by,這不應該是必需的。
  • 基本上你想過濾所有需要更新的行 - 嘗試把它放入使用連接的select中。並且始終首先使用最有可能過濾出最多行的條件。
  • 並且始終嘗試優化語句時,請使用explain plan命令查看執行計劃。有了這個,你可以看到使用全表掃描或索引等內容。如有必要,您可以提供optimizer hints來控制執行語句的最佳方式。
相關問題