我在MS Access数据库上使用SQL查询,并有一个如下表:
Team Country City Firstname Surname RecordedDateTime
Group Panda 7 USA New York Jim Smith 12/07/2016 09:10:06
Group Tiger 5 USA Boston Jack Thompson 05/07/2016 19:15:21
Group Goat 12 USA New York Jim Smith 12/07/2016 09:10:06
Group Lion 9 France Paris Tom Pryor 06/07/2016 10:10:08
Group Eagle 2 USA New York Dale Wycliff 12/07/2016 12:28:09
.....
现在,我试图删除记录:最新的日期/时间(最多不超过一个);拥有相同的国家,城市,名字和姓氏;那些没有" Panda"在团队中,或者如果没有" Panda"然后那些没有" Goat"在团队中,或者如果没有" Goat"然后那些没有"狮子"在团队中等等。所以对于Jim Smith,我想删除显示的第三条记录。
希望这是有道理的。到目前为止,我可以使用以下内容删除早于最新日期/时间的记录:
DELETE DISTINCTROW T1.* FROM Results T1 LEFT JOIN (SELECT Country, City, Firstname, Surname, MAX(RecordedDateTime) AS LatestTime
FROM Results GROUP BY Country, City, Firstname, Surname) T2 ON T1.Country = T2.Country AND T1.City = T2.City
AND T1.Firstname = T2.Firstname AND T1.Surname = T2.Surname WHERE T1.RecordedDateTime <> T2.LatestTime
但问题是处理多个最大值和部分字段的条件。
答案 0 :(得分:1)
考虑使用render_403
子句子查询将删除查询设为updateable,从而可删除。您的需求有点不寻常,因为您需要一个既不是数字也不是字符串排序的特定团队订单。因此,嵌套WHERE
用于使用IIF()
进行此类排序。
Pandas (lowest) < Tiger < Goat < Lion < Eagle (highest)
如果有更多团队订单,请添加到条件逻辑或更好地使用查找表与结果表连接。这样您就可以避免嵌套DELETE *
FROM Results T1
WHERE (T1.RecordDateTime <>
(SELECT MAX(RecordDateTime) AS LatestTime
FROM Results sub
WHERE sub.Country = T1.Country
AND sub.City = T1.City
AND sub.Firstname = T1.Firstname
AND sub.Surname = T1.Surname
GROUP BY Country, City, Firstname, Surname))
OR (NOT IIF(Team LIKE '*Panda*', 1,
IIF(Team LIKE '*Tiger*', 2,
IIF(Team LIKE '*Goat*', 3,
IIF(Team LIKE '*Lion*', 4,
IIF(Team LIKE '*Eagle*', 5, NULL))))) IN
(SELECT MIN(IIF(Team LIKE '*Panda*', 1,
IIF(Team LIKE '*Goat*', 2,
IIF(Team LIKE '*Goat*', 3,
IIF(Team LIKE '*Lion*', 4,
IIF(Team LIKE '*Eagle*', 5, NULL))))))
FROM Results sub
WHERE sub.Country = T1.Country
AND sub.City = T1.City
AND sub.Firstname = T1.Firstname
AND sub.Surname = T1.Surname
GROUP BY Country, City, Firstname, Surname))
,只需使用 TeamValue :
IIF()