首页 > 解决方案 > Oracle - 查询以根据其他 ID 填充虚拟数据

问题描述

我有一个表 A,它有 100 万个不同的 ID。

+---------+
|   ID    |
+---------+
| 1       |
| 2       |
| 3       |
| 4       |
| 5       |
| .       |
| .       |
| 1000000 |
+---------+

我有另一个表 B,其中包含有关以下格式的一些 ID(大约 200)的信息。我有多项措施(仅显示 2 个)

+----+---------+--------+-------+
| ID | Measure | Month  | Value |
+----+---------+--------+-------+
|  1 | loss    | 1      | 200   |
|  1 | loss    | 2      | 180   |
|  1 | loss    | 3      | 250   |
|  1 | .       | .      | .     |
|  1 | .       | .      | .     |
|  1 | Balance | 1      | 100   |
|  1 | Balance | 2      | 140   |
|  1 | Balance | 3      | 500   |
|  1 | .       | .      | .     |
|  1 | .       | .      | .     |
|  2 | loss    | 1      | 140   |
|  2 | loss    | 2      | 300   |
|  2 | loss    | 3      | 250   |
|  2 | .       | .      | .     |
|  2 | .       | .      | .     |
|  2 | Balance | 1      | 500   |
|  2 | Balance | 2      | 210   |
|  2 | Balance | 3      | 330   |
|  2 | .       | .      | .     |
|  2 | .       | .      | .     |
+----+---------+--------+-------+

如何使用虚拟数据(用于度量、月份和值列)缩放表 B,以获取有关 Oracle 中 A 中所有 100 万个 ID 的信息?我正在寻找可以完成此任务的查询/存储过程。

谢谢你。

标签: sqloraclestored-procedures

解决方案


您可以使用join. 这是一种方法——假设 id 是连续的,没有间隙:

select a.id, b.*
from a join
     (select b.*, count(distinct id) over () as num_ids
      from b
     ) b
     on mod(a.id, b.num_ids) = mod(b.id, b.num_ids);

如果您不能保证 id 是连续的:

select a.id, b.*
from (select a.*, row_number() over (order by id) as seqnum
      from a
     ) a join
     (select b.*, count(distinct id) over () as num_ids,
             dense_rank() over (order by id) as seqnum
      from b
     ) b
     on mod(a.seqnum, b.num_ids) = mod(b.seqnum, b.num_ids);

推荐阅读