【发布时间】:2015-11-16 13:32:09
【问题描述】:
我有三张桌子:
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:
-
ID的INDICATOR表存在于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(考虑性能效率)?
【问题讨论】:
-
如果是T-SQL(决定你使用mysql/orace/sqlserver)标签,你绝对可以将第一部分简化为
UPDATE INDICATOR SET INDICATOR_NEW = 0 FROM INDICATOR i JOIN DETAILS D1 ON i.ID = D1.ID ... -
谢谢。那么它会提高代码的性能吗? ?你也可以建议第二部分吗??
-
如果您使用 SqlFiddle 准备结构、示例数据和共享链接,帮助会容易得多。
-
不要用多个数据库标记问题,除非你需要解决所有问题(如果是这样,应该在问题中指出),这只是令人困惑,因为不同的数据库使用不同的语法,所以例如,为 MSSQL 编写的答案不适用于 MySQL 等。只需包含您实际使用的数据库即可。
-
我想回答我的 sql。谢谢。
标签: mysql sql sql-server oracle sql-update