访问查询 - 基于最新日期的更新

时间:2015-11-10 03:54:38

标签: sql ms-access

我试图在其他线程上找到答案,但无法找到。如果它被另一个帖子所覆盖,请原谅我。

我对T-SQL比较陌生,所以请原谅我是否应该知道这件事。

我有一个简单的 Access 数据库,其中包含两个表:联系人和订单。

联系人列是ID(PK),FirstName,LastName,Address,状态字段(标识客户是否是" PC",在这种情况下哪个是重要的),还有一个字段为"延迟。"这个字段是" true"对于那些在过去两个月内没有订购的客户("假的"对于那些有的人)。

订单表包含订单号,以及客户ID(与联系人相关的PK),FirstName,LastName,Date。

我试图写一个查询来更新"延迟" “联系人”表中的字段,基于“订单”表中的最新订单日期。在这种情况下,将该字段更新为" false"对于每个PC客户,如果他们的最新订单日期在过去60天内。它似乎非常严格,但我显然在这里遗漏了一些东西。我使用SELECT子查询来定义条件。查询似乎忽略了我的条件,并希望更新数据库中的所有行。有什么想法吗?

UPDATE Contacts SET Contacts.Delayed = False
WHERE EXISTS (SELECT Contacts.FirstName, Contacts.LastName, Contacts.Status, Max(Orders.Date)
FROM Contacts INNER JOIN Orders ON (Contacts.ID = Orders.ContactID)
GROUP BY Contacts.FirstName, Contacts.LastName, Contacts.Status
HAVING Max(Orders.Date) > Date()-60);

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

因为您使用的是exists,所以如果查询返回结果,则所有联系人都将设置其延迟属性。

您要做的是使用联接过滤您要更新的结果。您需要左连接,因为您想查找过去两个月内未发生的订单。

UPDATE  tblContacts
SET     Contacts.Delayed = False
FROM    Contacts tblContacts
        LEFT JOIN ( SELECT  Contacts.FirstName ,
                            Contacts.LastName ,
                            Contacts.Status ,
                            MAX(Orders.Date)
                    FROM    Contacts
                            INNER JOIN Orders ON ( Contacts.ID = Orders.ContactID )
                    GROUP BY Contacts.FirstName ,
                            Contacts.LastName ,
                            Contacts.Status
                    HAVING  MAX(Orders.Date) > Date() - 60
                  ) tbl ON tbl.Contacts.Id = tblContacts.Id
WHERE   tblContacts.Id IS NULL