我试图在其他线程上找到答案,但无法找到。如果它被另一个帖子所覆盖,请原谅我。
我对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);
非常感谢任何帮助。
答案 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