我需要以特定方式连接 2 个表。"日期"是一个单列表,仅显示从 1990 年到 2040 年的每一天。"余额"有数百个银行账户的余额。诀窍:只有当帐户余额发生变化时,数据库才会在"余额"中为该帐户创建新条目。帐户具有新余额后,将创建一个新条目。余额保持不变的天数没有条目。
现在,我需要创建一个视图,显示每天所有帐户的余额。这意味着我必须显示"日期"中的日期以及每个帐户的相应余额。当我加入两个表时,在给定的一天,我只看到当天更改的帐户,我看不到未更改的帐户余额。我该如何解决这个问题?
"枣"
Date
1.1.1990
2.1.1990
3.1.1990
"平衡"
Date Account Balance
1.1.1990 1 100
1.1.1990 2 60
1.1.1990 3 0
2.1.1990 2 50
3.1.1990 1 150
期望的结果
Date Account Balance
1.1.1990 1 100
1.1.1990 2 60
1.1.1990 3 0
2.1.1990 1 100
2.1.1990 2 50
2.1.1990 3 0
3.1.1990 1 150
3.1.1990 2 50
3.1.1990 3 0
如果要提供表和一些示例数据的说明,则提供更正确的查询会更容易。但是,我认为此查询会起作用 - 它将从 BALANCE 返回最接近给定日期行:
SELECT * FROM DATES d, BALANCE b
WHERE d.date >= b.date
AND b.date >= ALL (SELECT b1.date FROM BALANCE b1
WHERE b1.date <= d.date
AND b1.account = b.account)
此查询应提供所需的结果:
SELECT d.date, b.account, b.balance FROM DATES d, BALANCE b
WHERE d.date >= b.date
AND b.date >= ALL (SELECT b1.date FROM BALANCE b1
WHERE b.account = b1.account
AND d.date >= b1.date)
ORDER BY d.date, b.account
更简洁的方法应该是以下,其中 DATES 是日期表,其中 DATES 是日期表,D 作为日期属性,BALANCE 是余额表,属性BAL_DATE为余额日期,AMOUNT 用于当前余额:
SELECT SUB.D, B.AMOUNT
FROM (
SELECT D.D AS D,MAX(B.BAL_DATE) AS BD
FROM DATES D, BALANCE B
WHERE D.D>=B.BAL_DATE
GROUP BY D.D) AS SUB, BALANCE B
WHERE SUB.BD = B.BAL_DATE
ORDER BY SUB.D
SUB 子查询将所有日期行与余额行的日期小于或等于相应日期行进行匹配,并且对于每个日期行,将具有最大日期的余额行进行匹配,即最近的余额或当前余额(如果两个日期相等)。外部主查询的目的是获取每个日期的相应金额。