使用日期子句编写子查询

Writing a sub-query using a date clause

所以基本上我是想写一些东西,如果他们在当前日期的最后 6 个月内进行了预订,就会打印出客户的姓名和区号。

我的代码看起来像这样(它必须是一个子查询,不使用连接)

SELECT custfirstname, custareacode
FROM Customer
WHERE customerid IN (SELECT bookingdate
                FROM Bookings
                  WHERE DateDiff(CURDATE(), bookingdate) <=180);

然而它不起作用,但我可以使用连接函数让它工作,但我不能使用子查询,我如何在没有连接函数的子查询中做到这一点?

您需要从 bookings table

select customerid
SELECT custfirstname, custareacode
FROM Customer
WHERE customerid IN (SELECT customerid
                FROM Bookings
                  WHERE DateDiff(CURDATE(), bookingdate) <=180);

您的代码的问题是子查询 returns 列 bookingdate,然后您将其与 customerid 进行比较。这不匹配。

我会推荐 exists 和一个相关的子查询。假设您在 bookings 中确实有列 customerid,那么:

select c.custfirstname, c.custareacode
from customer c
where exists (
    select 1
    from bookings b
    where b.customerid = b.customerid 
      and b.bookingdate >= current_date - interval 6 month
)

有了正确的索引,exists 在大型数据集上的表现通常比 in() 好得多。在这里,您需要 bookings(customerid, bookingdate).

上的索引