带有 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"
也许您遇到的问题是“上次付款”只是一个列标题,而不是任何列的实际名称。
我是运行 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"
也许您遇到的问题是“上次付款”只是一个列标题,而不是任何列的实际名称。