如何读取sql中的先前值

时间:2014-01-19 21:03:34

标签: sql oracle

我有一个表格,其中存储了ID,参考ID和金额。问题是,对于设置了引用ID的行,缺少数量。我需要读取reference_id = ID的行并读取数量并设置值(如表2所示)。

+--+------------+------+
|ID|Reference ID|Amount|
+--+------------+------+
|1 |            |300   |
+--+------------+------+
|2 |1           |      |
+--+------------+------+

我希望能够展示: 表2

+--+------------+------+
|ID|Reference ID|Amount|
+--+------------+------+
|1 |            |300   |
+--+------------+------+
|2 |1           |300   |
+--+------------+------+

任何人都知道找到这个缺失值的最佳方法是什么? 最好的祝福。 MEJ

2 个答案:

答案 0 :(得分:3)

我想你想要一个自我加入:

select t1.id, t1.referenceid, coalesce(t2.amount, t1.amount) as amount
from table1 t1 left outer join
     table1 t2
     on t1.id = t2.referenceid;

答案 1 :(得分:3)

我认为您需要分层查询:

select id, ref_id, connect_by_root amount
from <your table>
connect by prior id = ref_id
start with ref_id is null;

SQL Fiddle

有关connect_by_root operator in the documentation的更多信息。

allows for multiple levels因为它始终返回amount的根目录。但是,这种假设儿童记录本身从未有amount,或者可以忽略。如果设置了子值,则可以使用nvl,但子节点的子节点仍会返回到根节点。如果要显示以前的值,可以在条件中添加amount空检查:

select id, ref_id, connect_by_root amount as amount
from <your table>
connect by prior id = ref_id and amount is null
start with ref_id is null or amount is not null
order by id;

SQL Fiddle