【问题标题】:Oracle - SQL to get data from all tables with specific column and valueOracle - SQL 从具有特定列和值的所有表中获取数据
【发布时间】:2020-03-17 00:11:20
【问题描述】:

我有十几个与 COLUMN_NAME ENTITY_ID 连接的表,我想找到所有具有特定值的相关记录, 我可以找到包含特定列的表格

select * from all_tab_cols a where a.COLUMN_NAME='ENTITY_ID';

我可以找到每个表的记录

select * from TABLENAME where ENTITY_ID='100';

有没有办法使用单个 SQL 来查看所有表中的所有相关记录?

【问题讨论】:

  • 所有表的结构都一样吗?一个结果如何为您提供包含来自结构未知的不同表的数据的输出?请分享示例数据和预期输出
  • @Tejash 无关,获取所有数据,如select * from a,b,c
  • @user7294900 如果您来自 Java 世界,可能会有误解。 SELECT * 表示select Object - 它只是一个特定表的所有列的快捷方式。
  • @MarmiteBomber 你仍然可以在没有 Java 的 oracle 中 select * from a,b,c 并显示所有列
  • 可以肯定,但Cartesian join 并不总是您想要报告数据的内容...(三个 10 行表有 1.000 行)。

标签: oracle


【解决方案1】:

我不确定会发生什么,所以根据我的理解回答如下:

  • 假设我们有一个表ACCOUNT,其中CUST_ID 列如下:
SQL> SELECT OWNER, A.TABLE_NAME, COLUMN_NAME FROM
  2      ALL_TAB_COLS A
  3  WHERE
  4      A.COLUMN_NAME = 'CUST_ID';

OWNER      TABLE_NAME           COLUMN_NAME
---------- -------------------- --------------------
TEJASH     ACCOUNT              CUST_ID

SQL> SELECT * FROM ACCOUNT;

    ACC_NR       SUM_    CUST_ID
---------- ---------- ----------
       500       3400        100
  • 现在,我想在所有表(我有权访问)中进行搜索,以查找所有具有 CUST_ID 列且其中包含值 100 的表。
SQL> SELECT
  2      table_name, COLUMN_NAME,
  3      to_number(xmlquery('/ROWSET/ROW/C/text()'
  4      passing xmltype(dbms_xmlgen.getxml(
  5        'select count(1) as c '
  6        || 'from "' || owner || '"."' || table_name || '" WHERE ' || COLUMN_NAME  || '=''100'''))
  7    returning content)) as cOUNT
  8  FROM ALL_TAB_COLS A
  9  WHERE A.COLUMN_NAME = 'CUST_ID';

TABLE_NAME           COLUMN_NAME               COUNT
-------------------- -------------------- ----------
ACCOUNT              CUST_ID                       1

在这里,每个带有CUST_ID 列的表都会出现,COUNT 列会显示该表中带有CUST_ID = 100 的记录数

  • 现在,让我们在另一个表中添加一列,看看效果:
SQL> ALTER TABLE ACTIVE_USERS ADD CUST_ID VARCHAR2(100);

Table altered.

SQL> INSERT INTO ACTIVE_USERS VALUES (5,SYSDATE, SYSDATE, 200);

1 row created.

SQL> SELECT * FROM ACTIVE_USERS;

  CUST_NUM START_DATE           END_DATE             CUST
---------- -------------------- -------------------- ----
########## 21-NOV-19            21-NOV-19            200
########## 21-NOV-19            21-NOV-19
########## 01-JAN-18            01-JAN-19
########## 01-JAN-18
########## 01-JAN-19            01-JUN-19
########## 01-JAN-17            01-MAR-19

6 rows selected.
  • 现在,再次运行查询以从所有表中查找数据:
SQL> SELECT
  2      table_name, COLUMN_NAME,
  3      to_number(xmlquery('/ROWSET/ROW/C/text()'
  4      passing xmltype(dbms_xmlgen.getxml(
  5        'select count(1) as c '
  6        || 'from "' || owner || '"."' || table_name || '" WHERE ' || COLUMN_NAME  || '=''100'''))
  7    returning content)) as cOUNT
  8  FROM ALL_TAB_COLS A
  9  WHERE A.COLUMN_NAME = 'CUST_ID';

TABLE_NAME           COLUMN_NAME               COUNT
-------------------- -------------------- ----------
ACCOUNT              CUST_ID                       1
ACTIVE_USERS         CUST_ID                       0

SQL>

而且,它成功了!!

  • 再次向ACTIVE_USERS 表添加更多数据并查看结果。
SQL> INSERT INTO ACTIVE_USERS VALUES (6,SYSDATE-1, SYSDATE, 100);

1 row created.

SQL> INSERT INTO ACTIVE_USERS VALUES (7,SYSDATE-2, SYSDATE, 100);

1 row created.

SQL> INSERT INTO ACTIVE_USERS VALUES (8,SYSDATE-3, SYSDATE, 100);

1 row created.

SQL> SELECT * FROM ACTIVE_USERS;

  CUST_NUM START_DATE           END_DATE             CUST
---------- -------------------- -------------------- ----
########## 21-NOV-19            21-NOV-19            200
########## 20-NOV-19            21-NOV-19            100
########## 19-NOV-19            21-NOV-19            100
########## 18-NOV-19            21-NOV-19            100
########## 21-NOV-19            21-NOV-19
########## 01-JAN-18            01-JAN-19
########## 01-JAN-18
########## 01-JAN-19            01-JUN-19
########## 01-JAN-17            01-MAR-19

9 rows selected.
  • 现在让我们检查一下我们的查询结果。
SQL> SELECT
  2      table_name, COLUMN_NAME,
  3      to_number(xmlquery('/ROWSET/ROW/C/text()'
  4      passing xmltype(dbms_xmlgen.getxml(
  5        'select count(1) as c '
  6        || 'from "' || owner || '"."' || table_name || '" WHERE ' || COLUMN_NAME  || '=''100'''))
  7    returning content)) as cOUNT
  8  FROM ALL_TAB_COLS A
  9  WHERE A.COLUMN_NAME = 'CUST_ID';

TABLE_NAME           COLUMN_NAME               COUNT
-------------------- -------------------- ----------
ACCOUNT              CUST_ID                       1
ACTIVE_USERS         CUST_ID                       3

SQL>

再次,它成功了! :)

干杯!!

【讨论】:

  • 谢谢!我更喜欢select *,它返回错误ORA-06502 PL/SQL: numeric or value error
  • Select * 无法工作,因为每个表都有不同数量和类型的列。相反,您可以在 pl/sql 中使用循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2017-09-13
  • 2013-06-29
  • 2017-07-04
相关资源
最近更新 更多