我需要以特定方式加入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
答案 0 :(得分: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
答案 1 :(得分:0)
更简洁的方法应该是以下,其中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子查询匹配所有日期行,其中余额行的日期小于或等于相应的日期行,并且对于每个日期行,余额行的最大日期为i。即如果两个日期相等,则为最近的余额或当前余额。 外部主查询的目的是获取每个日期的相应金额。