从表中选择记录,其中表名来自另一个表

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创建查询,然后执行它。

例如:

  1. https://livesql.oracle.com/apex/livesql/file/content_C81136WLRFYZF8ION6Q57GWE1.html - 详细的游标示例。
  2. https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm#i13057 - Oracle中的动态SQL

以上是关于从表中选择记录,其中表名来自另一个表的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择字段,其中 id 不在 mysql 的另一个表中 [不工作]

如何从表中选择记录并插入另一个表?

SQL 从表中选择并获取表名

从表中选择值,其中名称存储在另一个表中

从表中选择最新的带时间戳的值,该表对于一个列 id 有多个条目,对于每个唯一的列 id 和来自另一个表的数据

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值