用select更新数据表

时间:2015-01-14 23:02:53

标签: mysql sql

如何使用where子句

中的Select更新表

实施例

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

Where (Results of Below Query )

SELECT 
    Distinct(TopLevelAsset_Num) 
FROM cp_asseteventinquiry
WHERE 
    cp_asseteventinquiry.History='NO'
    AND NOT EXISTS(
        SELECT * 
        FROM flightlogs 
        WHERE 
            flightlogs.Asset=cp_asseteventinquiry.TopLevelAsset_Num 
            AND flightlogs.Scheduled_Date=date_format (curdate(), '%m/%d/%Y')
    );

2 个答案:

答案 0 :(得分:0)

改为使用left join

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格式,以便正确排序字符串。

答案 1 :(得分:0)

您想要实现的目标并不完全清楚,但您可以使用这样的查询:

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

要在Due_Date列中值'NO'的每一行设置History列,并且{{1}中没有任何对应的行满足指定条件的表。

根本不清楚为什么你需要以特定格式格式化日期,除非这些日期存储在字符类型列中,这是完全奇怪的,因为MySQL有一个自定义设计用于存储日期的数据类型值,flightlogs数据类型。


注意:不要将表格放在不必要的表达式上,特别是如果它们没有添加任何含义。例如,在这种情况下的parens没有意义:

DATE

这等同于我们通常使用的,

SELECT DISTINCT(TopLevelAsset_Num) ...

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


<强>后续

我能看到的唯一原因是SELECT DISTINCT TopLevelAsset_Num ... 得到一个明确的列表,其中一些具有相同值的行有TopLevelAsset_Num而其他行没有。{0}}。并且您希望使用匹配的History='NO'更新所有行。

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

TopLevelAsset_Num