【发布时间】:2012-02-06 05:05:25
【问题描述】:
这可能看起来很简单,但不知何故并非如此。我有一个名为 TBL_A 的历史汇率数据表,如下所示:
| id | rate | added_date |
|--------|--------|--------------|
| bill | 7.50 | 1/24/2011 |
| joe | 8.50 | 5/3/2011 |
| ted | 8.50 | 4/17/2011 |
| bill | 9.00 | 9/29/2011 |
在 TBL_B 中,我有几个小时需要加入到 TBL_A 的单行才能获得成本信息:
| id | hours | added_date |
|--------|---------|--------------|
| bill | 10 | 2/26/2011 |
| ted | 4 | 7/4/2011 |
| bill | 9 | 10/14/2011 |
如您所见,对于 Bill,TBL_A 中有两个费率,但它们的日期不同。要正确获取一段时间内 Bill 的成本,您必须将 TBL_B 的每一行连接到 TBL_A 中适合该日期的一行。
我认为这很容易;因为这不需要非常快的查询,所以我可以为每一行成本信息做一个单独的子查询。但是,连接的子查询显然不能“看到”它们连接的其他表。此查询会在子查询中具有“h”别名的任何内容上引发无效标识符 (ORA-00904):
SELECT h.id, r.rate * h.hours as "COST", h.added_date
FROM TBL_B h
JOIN (SELECT * FROM (
SELECT i.id, i.rate
FROM TBL_A i
WHERE i.id = h.id and i.added_date < h.added_date
ORDER BY i.added_date DESC)
WHERE rownum = 1) r
ON h.id = r.id
如果问题只是范围界定,我不知道我采用的方法是否可行。但我在这里要做的只是根据某些标准获得单行,所以我绝对愿意接受其他方法。
编辑:所需的输出是这样的:
| id | cost | added_date |
|--------|---------|--------------|
| bill | 75 | 2/26/2011 |
| ted | 34 | 7/4/2011 |
| bill | 81 | 10/14/2011 |
请注意,Bill 在表中的两个条目中有两个不同的费率。第一行是 10 * 7.50 = 75,第二行是 9 * 9.00 = 81。
【问题讨论】:
-
期望的输出是什么?小时的总和?
-
我想这很模糊,我已经将我的问题编辑得更具体。
标签: sql join oracle11g subquery