我有三张 table :
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
表的 INDICATOR_NEW
值更新为 0:
INDICATOR
表的ID
存在于DETAILS
表中。- 上述 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
(考虑性能效率)?
最佳答案
- 您应该使用
indicator
的别名,比如I
- 第一个
存在
,我猜你的意思是I.ID = D1.ID
- 第二个
存在
,我没有看到您使用外部表,因此结果将始终相同。还要小心,因为我认为查询无论如何都会返回一个值。 - 对于这种情况,
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
)
关于mysql - SQL查询根据两个不同表的条件更新一个表的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32160063/