2015-08-22 29 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

相关问题