从表中选择记录,其中表名来自另一个表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从表中选择记录,其中表名来自另一个表相关的知识,希望对你有一定的参考价值。
我们动态生成表格。表T_1,T_2,T_3等我们可以通过以下查询从另一个表中获取该表名。
SELECT CONCAT('T_', T_ID) AS T_NAME FROM T_NAMES WHERE T_KEY = 'ABC';
现在我想从这个检索到的表名中获取记录。我能做什么 ?
我正在做跟随,但这不起作用:
SELECT * FROM (SELECT CONCAT('T_', T_ID) AS T_NAME FROM T_NAMES WHERE T_KEY = 'ABC')
仅供参考:截至目前,我正在进行两次单独查询,但由于存在一些限制,我想要删除一个并且我无法遵循光标/过程方法。
答案
使用refcursor的程序似乎对我来说最合适。这是一个例子:
SQL> -- creating test case (your T_NAMES table and T_1 which looks like Scott's DEPT)
SQL> create table t_names (t_id number, t_key varchar2(3));
Table created.
SQL> insert into t_names values (1, 'ABC');
1 row created.
SQL> create table t_1 as select * from dept;
Table created.
SQL> -- a procedure; accepts KEY and returns refcursor
SQL> create or replace procedure p_test
2 (par_key in varchar2, par_out out sys_refcursor)
3 as
4 l_t_name varchar2(30);
5 begin
6 select 'T_' || t_id
7 into l_t_name
8 from t_names
9 where t_key = par_key;
10
11 open par_out for 'select * from ' || l_t_name;
12 end;
13 /
Procedure created.
好的,让我们测试一下:
SQL> var l_out refcursor
SQL> exec p_test('ABC', :l_out)
PL/SQL procedure successfully completed.
SQL> print l_out
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL>
另一答案
我可以向你推荐动态SQL。首先,您需要创建一个游标。游标将按动态表进行迭代。然后,您可以使用动态SQL创建查询,然后执行它。
例如:
- https://livesql.oracle.com/apex/livesql/file/content_C81136WLRFYZF8ION6Q57GWE1.html - 详细的游标示例。
- https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm#i13057 - Oracle中的动态SQL
以上是关于从表中选择记录,其中表名来自另一个表的主要内容,如果未能解决你的问题,请参考以下文章
从表中选择字段,其中 id 不在 mysql 的另一个表中 [不工作]