带有 LEFT JOIN 和 MAX 的 LibreOffice HSQLDB WHERE 子句?

LibreOffice HSQLDB WHERE clause with LEFT JOIN and MAX?

我是运行 macOS 11.6,LibreOffice 7.2.2.2,HSQLDB(我的理解是这是v.1.8,但不知道如何验证)

我是 SQL 的新手,我正在尝试编写数据库来维护俱乐部会员名册。我试图在数据库中找到应该向其发送续订信件的每个人。奇怪的是,如果一个人过去从未付款过,他们 应该 收到续约信。最近没有续约的老会员不会续约,显然,每个人应该只收到一封信。我创建了一个玩具示例来显示我遇到的问题...

Members table:
Key (Integer, Primary key, Autoincrement)
Name (Varchar)
+-----+----------+
| Key | Name     |
+-----+----------+
|  0  | Abby     |
|  1  | Bob      |
|  2  | Dave     |
|  3  | Ellen    |
+-----+----------+

Payments table:
Key (Integer, Primary Key, autoincrement)
MemberKey (Integer, foreign key to Member table)
Payment Date (Date)
+-----+-----------+--------------+
| Key | MemberKey | Payment Date |
+-----+-----------+--------------+
|  0  |     0     | 2020-05-23   |
|  1  |     0     | 2021-06-12   |
|  2  |     1     | 2016-05-28   |
|  3  |     2     | 2020-07-02   |
+-----+-----------+--------------+

我发现包含所有人的唯一方法是使用 LEFT JOIN。我发现选择最近付款的唯一方法是使用 MAX。以下查询生成每个人最近付款的列表,包括从未付款过的人:

SELECT "Members"."Key", "Members"."Name", MAX( "Payments"."Payment Date" ) AS "Last Payment"
FROM { oj "Members" LEFT OUTER JOIN "Payments" ON "Members"."Key" = "Payments"."MemberKey" }
GROUP BY "Members"."Key", "Members"."Name"

它 returns 下面的结果,它只包括所有成员一次(Abby 有 2 次付款,但最近一次付款只出现一次)。不幸的是,它仍然包括像鲍勃这样的人,他们已经离开俱乐部太久了,我们不想向他们发送续约通知。

+-----+----------+--------------+
| Key | Name     | Last Payment |
+-----+----------+--------------+
|  0  | Abby     | 2021-06-12   |
|  1  | Bob      | 2016-05-28   |
|  2  | Dave     | 2020-07-02   |
|  3  | Ellen    |              |
+-----+----------+--------------+

当我尝试对最后一笔付款执行 任何 种条件操作以确定它是否是最近足以包含在续订通知列表中。例如,在 HSQLDB 中,下面的查询 returns 错误,“无法加载数据内容。不是条件。”此查询与第一个查询的唯一变化是添加了 WHERE 子句。

SELECT "Members"."Key", "Members"."Name", MAX( "Payments"."Payment Date" ) AS "Last Payment"
FROM { oj "Members" LEFT OUTER JOIN "Payments" ON "Members"."Key" = "Payments"."MemberKey" }
WHERE "Last Payment" >= '2020-01-01'
GROUP BY "Members"."Key", "Members"."Name"

所需的输出应如下所示:

+-----+----------+--------------+
| Key | Name     | Last Payment |
+-----+----------+--------------+
|  0  | Abby     | 2021-06-12   |
|  2  | Dave     | 2020-07-02   |
|  3  | Ellen    |              |
+-----+----------+--------------+

我一直在网络上搜索任何看起来相关的东西。我试过“HAVING”子句——我可以让它们与 COUNT(*) 函数一起工作,但我不能让它们与 MAX(*) 函数一起工作。我试过将我的第一个查询用作子查询,并在主查询中对“上次付款”应用 WHERE 子句。我已经尝试过人们所说的在 MySQL 中工作的解决方案,但我无法让它们在 HSQLDB 中工作。我尝试将第一个查询用作视图,并针对视图编写查询。我已经尝试了很多我什至不记得的其他事情。上面第一个查询之后的所有内容都会引发错误。我想包括我的玩具数据库,但找不到将其附加到 post.

的方法

有人可以帮忙吗?

这对我有用。

SELECT "Members"."Key", "Members"."Name", MAX( "Payments"."Payment Date" ) AS "Last Payment"
FROM {oj "Members" LEFT OUTER JOIN "Payments" ON "Members"."Key" = "Payments"."MemberKey"
    WHERE "Payments"."Payment Date" >= '2020-01-01'
    OR "Payments"."Payment Date" IS NULL}
GROUP BY "Members"."Key", "Members"."Name"

结果:

这也行。

SELECT "Members"."Key", "Members"."Name", MAX( "Payments"."Payment Date" ) AS "Last Payment"
FROM { oj "Members" LEFT OUTER JOIN "Payments" ON "Members"."Key" = "Payments"."MemberKey" }
WHERE "Payments"."Payment Date" >= '2020-01-01'
    OR "Payments"."Payment Date" IS NULL
GROUP BY "Members"."Key", "Members"."Name"

也许您遇到的问题是“上次付款”只是一个列标题,而不是任何列的实际名称。