首页 > 解决方案 > 如何根据给定的问题以及到目前为止的内容完成我的代码

问题描述

在我继续之前,我想说这是我班级的家庭作业。我们在 Microsoft Access 中使用 SQL。由于 covid-19 和我的教授上个月开发了该病毒而过渡到在线课程,我们还没有时间真正深入研究 SQL 的工作原理。我还将提供我拥有的数据库 ER 图的图片,希望能清楚地了解我正在努力实现的目标。https://imgur.com/a/4QGRgRc

现在我要解决的问题是:

  1. 检索住在德克萨斯州泰勒的客户的电话号码,该客户于 2020 年 1 月 1 日预订了两个房间。

到目前为止我写的代码如下

SELECT CUSTOMER.Phone_No, CUSTOMER.Address, RESERVATION.Reservation_No, INCLUDES.Check_in, ROOM.Room_No 

FROM CUSTOMER, RESERVATION, INCLUDES, ROOM 

SELECT CUSTOMER.Phone_No, WHERE CUSTOMER.Address = 'Tyler, Tx' AND INCLUDES.Check_in < '12/31/2019' AND INCLUDES.Check_in > '01/01/2020'

我很困惑现在去哪里,或者即使我到目前为止所拥有的东西会起作用。有人能给我指出我现在应该去哪里的正确方向吗?

标签: sqlms-access

解决方案


如果您只需要客户信息,请使用聚合查询。提取的每个字段都必须包含在 GROUP BY 子句中:
SELECT Customer.ID, CustomerName, Phone_No FROM Customer INNER JOIN Reservation ON Customer.ID = Reservation.CustomerID WHERE Address = 'Tyler, Tx' AND Check_in BETWEEN #12/31/2019# AND #01/01/2020# GROUP BY Customer.ID, CustomerName, Phone_No HAVING Count(CustomerID) = 2;

或者利用嵌套查询和 IN() 函数的强大功能:
SELECT * FROM Customer WHERE Customer.Address = 'Tyler, Tx' AND Customer.ID IN (SELECT CustomerID FROM Reservation WHERE Check_in BETWEEN #12/31/2019# AND #01/01/2020# GROUP BY CustomerID HAVING Count(*) = 2);

或者使用 DCount()。但是,域聚合函数会降低查询性能。
SELECT * FROM Customer WHERE Customer.Address = 'Tyler, Tx' AND DCount("*", "Reservation", "Check_in BETWEEN #12/31/2019# AND #01/01/2020# AND CustomerID=" & Customer.ID) = 2;


推荐阅读