如何使用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')
);
答案 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