【问题标题】:how to select values from tables which start with prefix如何从以前缀开头的表中选择值
【发布时间】:2019-08-14 07:32:59
【问题描述】:

我是 oracle 数据库的新手,我有大约 100 个以 PRE:

之类的前缀开头的表
CREATE TABLE PRE1 (
         name      VARCHAR2(15),
         value      VARCHAR2(15))
CREATE TABLE PRE2 (
         name      VARCHAR2(15),
         value      VARCHAR2(15))
CREATE TABLE PRE3 (
         name      VARCHAR2(15),
         value      VARCHAR2(15))
...
.....etc

我需要在java中从所有以前缀PRE开头的表中选择名称和值;像这样:

select name, value from all tables which start with **PRE**

这可能吗?

现在我想在 java 中创建 select 语句以从所有以 PRE

开头的表中获取名称和值

【问题讨论】:

  • 这看起来像是一个糟糕的数据模型。那应该是一个带有 column 的表,用于标识它是“pre2”还是“pre2”
  • @a_horse_with_no_name 它们实际上是视图,我放了表格以使其更容易
  • 视图或表格,同样如此 - 如果它都在一个视图(或表格)内,则选择几乎是显而易见的。可能您想要构建一个像select name,value from PRE1 union select name,value from PRE2 union select name, value from PRE3 union... 这样的选择,最终以编程方式使用以下答案中已经建议的选择

标签: java sql oracle


【解决方案1】:

如果你真的需要这个,可以通过以下方式:

SQL> CREATE TABLE PRE1 (
  2           name      VARCHAR2(15),
  3           value      VARCHAR2(15))
  4  /

Table created.

SQL> CREATE TABLE PRE2 (
  2           name      VARCHAR2(15),
  3           value      VARCHAR2(15))
  4  /

Table created.

SQL> CREATE TABLE PRE3 (
  2           name      VARCHAR2(15),
  3           value      VARCHAR2(15))
  4  /

Table created.

SQL> select table_name from user_tables where table_name like 'PRE%';

TABLE_NAME
------------------------------
PRE1
PRE2
PRE3

SQL>

这里我使用 USER_TABLES,而您可能需要 ALL_TABLESDBA_TABLES,具体取决于您的需要和/或权限。

然而,乍一看,这似乎不是最好的设计,所以也许你会重新考虑它。

【讨论】:

    【解决方案2】:

    见这篇文章:

    http://blog.sqlauthority.com/2008/04/29/sql-server-find-table-in-every-database-of-sql-server/

    如果没有,请遵循。基本上他创建的是一个存储过程,它将搜索您在每个数据库中指定的每个表名。

    如果你这样做:

    select * from sys.tables where name like '%tablename%'

    Select name from DBname.sys.tables where name like '%info'
    

    您每次都需要更改数据库,如果您有很多,那么您就会发现问题。

    【讨论】:

      【解决方案3】:

      如果你可以创建自己的类型,你可以在这里做一些有趣的事情:

      create or replace type tr as object (id varchar2(5), name varchar2(20));
      
      create type tt as table of tr;
      

      然后创建tt类型的函数返回值:

      create or replace function pre_list return tt pipelined is
        v tt;
      begin
        for t in (select table_name from user_tables where table_name like 'PRE%')
        loop
          execute immediate 'select tr(id, name) from '||t.table_name 
            bulk collect into v;
          for i in 1..v.count() loop
            pipe row (v(i));
          end loop;
        end loop;
      end;
      

      然后你可以这样称呼它:

      select * from table(pre_list());
      

      就是这样。这是一个小demo,有两个表,应该可以工作 100 个。

      【讨论】:

        猜你喜欢
        • 2015-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        • 2015-03-18
        • 2014-07-25
        相关资源
        最近更新 更多