使用中间映射表从表中选择数据



我有一个映射表,让我们说VW_MAPPING.

VW_MAPPING具有如下列和数据:

Metric TableA
VW_A
B VW_BC
VW_C D
VW_DE
VW_E

现在我想执行一个条件选择。 喜欢

when Metric = A then SELECT * FROM VW_A;
when Metric = B then SELECT * FROM VW_B;

i( 所有表的列数相同。

ii(基础表没有指标列

基本上,我将从输入表单中获取指标值。所以我想相应地显示数据。 如果给出A,那么我将显示来自VW_A的数据。对于哪个响应,我们必须使用我们将从哪个表获得VW_MAPPING.

我想要的是这样的东西:

SELECT * FROM variable_table_name;
variable_table_name = SELECT TABLE FROM VW_MAPPING WHERE METRIC = form input

这是伪代码

我不能使用 PL/SQL。

虽然可能不是最有效的方法,但我倾向于这样做:

with v as (
select 'A' as metric, a.* from vw_a a union all
select 'B', b.* from vw_b b union all
select 'C', c.* from vw_c c union all
. . . 
)
select v.*
from v
where metric = :metric;

也就是说,映射表实际上没有用。 您应该有一个包含所有指标的表和一个标识指标的附加列,而不是映射表。 您也可以使用视图而不是表来执行此操作。

这是你所期待的吗?

SELECT * FROM VW_A where Metric  in 
(selct Metric from VW_MAPPING);
SELECT * FROM VW_B where Metric  in 
(selct Metric from VW_MAPPING);

有几种方法可以做到这一点。

到目前为止,最好的方法是在用户界面层中处理这个问题 - 输入表单背后的代码应该决定要执行哪个查询。这有很多好处:代码更简单,可能会更快,并且您的数据库执行"存储和修改数据"任务,而不是"对用户选择做出反应"任务。

如果你真的做不到,你可以使用 UNION

select * 
from VW_A
where metric = 'A'
union
select * 
from VW_A
where metric = 'B'
...

这会将决策嵌入到查询中,而不是查看映射表。

如果你真的想使用你的映射表,你需要使用动态SQL,但你说你不能使用PL/SQL。

我不知道任何其他选择。

最新更新