2015-08-22 28 views
0

I的值有三個表:SQL查詢來更新一個表中的列的基於條件的兩個不同的表

INDICATOR 
--------------------- 
ID | INDICATOR_NEW 
--------------------- 
001 | 1 
002 | 1 
003 | 1 


DETAILS 
------------------------ 
ID | ADD | POSTDATE 
------------------------ 
001 | ADD1 | 02-AUG-15  
001 | ADD2 | 09-AUG-15 
002 | ADD1 | 09-AUG-15  
002 | ADD2 | 02-AUG-15 


HISTORY 
-------------------------------- 
ID | ADD | STARTDATE | VALUE 
-------------------------------- 
001 | ADD1 | 02-AUG-15 | 100   
001 | ADD2 | 09-AUG-15 | 10   
002 | ADD1 | 09-AUG-15 | 20   
002 | ADD2 | 02-AUG-15 | 25 

我必須寫一個SQL代碼來更新的INDICATOR表爲0 INDICATOR_NEW值基於以下檢查:

  1. IDINDICATOR的表中存在表DETAILS
  2. 紀錄上述ID存在於HISTORY表和該ID持有HISTORY.MAX(STARTDATE) = DETAILS.POSTDATE - 7

我想用下面的查詢以獲得結果:

UPDATE INDICATOR 
    SET INDICATOR_NEW = 0 
    WHERE INDICATOR_NEW = 1 
    AND EXISTS (SELECT 1 
       FROM DETAILS D1 
       WHERE ID = D1.ID) 
    AND EXISTS(SELECT 1 
       from (SELECT MAX(STARTDATE) OVER(PARTITION BY ID) RN,ID 
         from HISTORY H1)T1, 
         DETAILS D1 
       WHERE T1.RN = D1.DMDPOSTDATE - 7 
       AND T1.ID = D1.ID); 

這是獲得的正確方法期望的結果還是應該使用GROUP BY而不是PARTITION BY(考慮性能效率)?

+0

如果其是T-SQL(決定使用的MySQL/orace/SQLSERVER)標籤,則可以肯定簡化第一部分'更新指示器 SET INDICATOR_NEW = 0 FROM指標I JOIN詳情D1 ON我.ID = D1.ID ...' – lad2025

+0

Thanks.So它會提高代碼的性能。 ?你也可以建議在第二部分? – sqlpractice

+0

如果您使用[SqlFiddle](http://sqlfiddle.com/)準備結構,採樣數據和共享鏈接,它將更容易幫助。 – lad2025

回答

0
  • 您應該使用別名indicator讓說I
  • 首先exists,我猜你的意思是I.ID = D1.ID
  • exists,我沒有看到你使用外部表,那麼結果將是永遠的相同。也有小心,因爲我認爲查詢總是會返回一個值。
  • 對於這種情況下group by會給你同樣的結果。

UPDATE INDICATOR I -- include alias 
SET INDICATOR_NEW = 0 
WHERE 
    INDICATOR_NEW = 1 
AND EXISTS 
    (SELECT 1 
    FROM DETAILS D1 
    WHERE ID = D1.ID) -- use I.ID if that is the case 
AND EXISTS 
    (SELECT 1 
    FROM (SELECT H1.ID, MAX(H1.STARTDATE) RN 
      FROM HISTORY H1 
      GROUP BY H1.ID 
     )T1 , DETAILS D1 
    WHERE T1.RN = D1.DMDPOSTDATE - 7 
    AND T1.ID = D1.ID -- here you aren't using outer table so always same result 
) 
+0

因此,性能明智的GROUP BY更好地使用這裏而不是PARTITION BY? – sqlpractice

+0

我不確定,你將不得不執行分析比較。我的猜測可能是一樣的。但是'group by'對我來說很容易閱讀。 –

+0

嗨Juan ..感謝您的幫助。但是,您是否可以修改上面的代碼,以便INDICATOR表中的值只有在DETAILS和HISTORY表中存在時纔會更新,MAX(HISTORY.STARTDATE)= DETAILS.DMDPOSTDATE - 7 – sqlpractice

相關問題