Mysql 使用select更新数据表

Mysql 使用select更新数据表,mysql,sql,Mysql,Sql,如何使用Select in where子句更新表 例如: UPDATE cp_asseteventinquiry SET cp_asseteventinquiry.Due_Date = date_format (curdate(), '%m/%d/%Y') Where (Results of Below Query ) 改用左连接: UPDATE cp_asseteventinquiry ai LEFT JOIN (SELECT TopLevelAsset_N

如何使用Select in where子句更新表

例如:

UPDATE
    cp_asseteventinquiry
SET
    cp_asseteventinquiry.Due_Date = date_format (curdate(), '%m/%d/%Y')

Where (Results of Below Query )


改用
左连接

UPDATE cp_asseteventinquiry ai LEFT JOIN
       (SELECT TopLevelAsset_Num
        FROM cp_asseteventinquiry ai2
        WHERE ai2.History = 'NO' AND
              NOT EXISTS (SELECT 1
                          FROM flightlogs fl
                          WHERE fl.Asset = ai2.TopLevelAsset_Num  AND
                                fl.Scheduled_Date = curdate()
                         )
      ) tai
      ON ai.TopLevelAsset_Num = ai2.TopLevelAsset_Num
    SET ai.Due_Date = curdate()
WHERE ai2.TopLevelAsset_Num IS NULL;

更大的问题是为什么要将日期格式化为字符串。始终使用本机格式在数据库中存储日期。如果必须将日期存储为字符串,请使用yyyy-mm-dd格式,以便正确排序字符串。

不完全清楚您要实现什么,但您可以使用如下查询:

UPDATE cp_asseteventinquiry a
  LEFT
  JOIN flightlogs f
    ON f.Asset = a.TopLevelAsset_Num
   AND f.Scheduled_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y')
   SET a.Due_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y')
 WHERE a.History='NO'
   AND f.Asset IS NULL
历史记录
列中值为
'NO'
飞行日志
表中没有满足指定条件的任何对应行的每一行上设置
到期日

现在还不清楚为什么需要将日期格式化为特定的格式,除非这些数据存储在字符类型列中,考虑到MySQL有一个专门为存储日期值而设计的数据类型,
date
数据类型,这是非常奇怪的


注意:不要在表达式不需要的地方加上括号,尤其是在它们没有添加任何含义的情况下。例如,本上下文中的paren没有任何含义:

SELECT DISTINCT(TopLevelAsset_Num) ...
这相当于我们通常使用的

SELECT DISTINCT TopLevelAsset_Num ...
(添加parens令人困惑地使其看起来好像DISTINCT是一个带参数的函数。DISTINCT不是一个函数,而是一个关键字。它适用于SELECT列表中的所有表达式,列是否包装在parens中没有区别


跟进

我能看到的唯一原因是,您可以得到一个不同的
TopLevelAsset\u Num
列表,其中一些具有相同值的行具有
History='NO'
,而其他行则没有。您希望使用匹配的
TopLevelAsset\u Num
更新所有行

在这种情况下,请使用内联视图获取列表,并执行联接操作:

UPDATE cp_asseteventinquiry a
  JOIN ( SELECT n.TopLevelAsset_Num
           FROM cp_asseteventinquiry n
           LEFT
           JOIN flightlogs f
             ON f.Asset = n.TopLevelAsset_Num
            AND f.Scheduled_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y')
          WHERE n.History='NO'
            AND f.Asset IS NULL
       ) v
    ON v.TopLevelAsset_Num = a.TopLevelAsset_Num
   SET a.Due_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y')

请选择1个DBMS。您使用的是MySql还是SqlServer?为什么SELECT语句中的
TopLevelAsset_Num
有空格?为什么日期值存储在字符数据类型的列中,而不是
date
数据类型?为什么函数名
date_FORMAT
和空格之间Y如果我不清楚!!选择查询将给出需要更新的项目列表,更新查询应获取选择查询的结果。要求是使用选择查询获取需要更新的项目列表,然后更新作为选择查询结果的项目
UPDATE cp_asseteventinquiry a
  JOIN ( SELECT n.TopLevelAsset_Num
           FROM cp_asseteventinquiry n
           LEFT
           JOIN flightlogs f
             ON f.Asset = n.TopLevelAsset_Num
            AND f.Scheduled_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y')
          WHERE n.History='NO'
            AND f.Asset IS NULL
       ) v
    ON v.TopLevelAsset_Num = a.TopLevelAsset_Num
   SET a.Due_Date = DATE_FORMAT(CURDATE(), '%m/%d/%Y')