mysql - SQL查询根据两个不同表的条件更新一个表的列值

标签 mysql sql sql-server oracle sql-update

我有三张 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:

  1. INDICATOR 表的ID 存在于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(考虑性能效率)?

最佳答案

  • 您应该使用 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/

相关文章:

MySQL 5.7 JSON_EXTRACT 不适用于对象 : [ERROR] "Missing a closing quotation mark in string" 中带引号的字符串

sql - 递归 CTE 查询生成产品或页面层次结构

sql-server - Where 语句中的括号放置

mysql - 如何将我的托管 mysql 数据库导入到我的本地主机数据库?

mysql - 触发: DELETED table does not exist

mysql - 如何从第一个表中检索第二个表中没有引用的记录?

mysql - 使用格式化日期选择字段

sql - 使用 FOR JSON PATH 时解析 NVARCHAR 列中的 JSON 文本

mysql - 合并具有部分关系的两个表

mysql - 将原始sql转换为ZF2语句