Oracle - 从具有特定列和值的所有表中获取数据的 SQL

用户7294900

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

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

我可以找到每张表的记录

select * from TABLENAME where ENTITY_ID='100';

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

大力水手

我不确定预期会发生什么,因此根据我的理解回答如下:

  • 假设我们有一个表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>

再次,它奏效了!!:)

干杯!!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Oracle中获取具有特定值的列范围

搜索所有表,所有列以获取特定值SQL Server

SQL Server 2008 Standard,获取所有表以及列中的所有列和可能的数据

如何获取SQL Server表中具有最大值的所有记录

Oracle查找具有特定列的所有表

从具有Oracle SQL Developer中类型的表创建视图

没有聚合和常量表达式的sql oracle中的数据透视表

错误,没有足够的值在Oracle SQL中插入数据

oracle sql query:获取具有相同ID的表中所有条目的单独列

通过SQL ORACLE中的过程显示所有表数据

sql oracle-区分所有列

Oracle SQL:计算具有特定值的行数

描述表SQL Oracle

在Oracle SQL中,如何连接具有多值列的表

当一行数据具有特定值时,如何排除多行数据集?SQL-ORACLE

oracle sql查询在与列1和2匹配的第3列中查找具有多个值的行

如何列出在oracle sql中具有特定列的架构中的所有表?

Oracle SQL请求-SELECT中的SELECT具有MAX值

Oracle SQL-从所有值必须相等的表中获取值

在Oracle SQL中联接具有常见列的表

SQL:选择在特定列中具有特定值的帐户的所有行

SQL Server与Oracle中具有空值的列

oracle SQL:选择不同的值,其中它的所有记录中不包含另一个特定值

在 Oracle SQL 表中插入值的有效方法

在 Oracle SQL 中合并具有相同 ID 但不同列值的行

如何使用 SQL Server 从数据库中获取具有列的表的特定列中的所有表名和不同值

从月份获取所有日期 - Oracle SQL

如何从 SQL 表中获取行而忽略在特定列中具有重复值的行

Oracle SQL - 具有函数的计算列