【发布时间】:2021-12-30 00:08:08
【问题描述】:
我运行的是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"
它返回下面的结果,其中只包括一次所有成员(Abby 有 2 次付款,但最近一次付款只出现一次)。不幸的是,它仍然包括像 Bob 这样的人,他们已经离开俱乐部很长时间了,我们不想向他们发送续约通知。
+-----+----------+--------------+
| Key | Name | Last Payment |
+-----+----------+--------------+
| 0 | Abby | 2021-06-12 |
| 1 | Bob | 2016-05-28 |
| 2 | Dave | 2020-07-02 |
| 3 | Ellen | |
+-----+----------+--------------+
当我尝试对 Last Payment 执行 any 类型的条件操作以确定它是否足够新以包含在更新通知。例如,在 HSQLDB 中,下面的查询返回错误“无法加载数据内容。不是条件”。与第一个查询相比,此查询的唯一变化是添加了 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 中工作。我尝试使用第一个查询作为视图,并针对视图编写查询。我已经尝试了十几种我什至不记得的东西。上面第一个查询之后的所有内容都会引发错误。我想包含我的玩具数据库,但找不到将其附加到帖子的方法。
有人可以帮忙吗?
【问题讨论】:
-
Ratslinger 或ask.libreoffice.org/c/english/5 的其他人定期回答任何基本问题。您可以在该站点上附加示例 .odb。
-
这个问题的格式和例子都很好。
标签: join max where-clause hsqldb libreoffice