Sql 如何在ORACLE中对用户架构中的所有表运行单个查询

Sql 如何在ORACLE中对用户架构中的所有表运行单个查询,sql,oracle,Sql,Oracle,假设我有表A,B,C,…,Z,我想计算表中的所有条目,并像这样组合结果: SELECT 'A' AS A, count(*) from USER.A UNION . . . SELECT 'J' AS J, count(*) from USER.J UNION . . SELECT 'Z' AS 'Z' COUNT(*) from USER.Z 我想避免以上所有的麻烦。如何以智能的方式执行此操作?我倾向于使用用户表元信息视图编写查询,并首次选择实际为sql查询的文本: SELECT

假设我有表
A,B,C,…,Z
,我想计算表中的所有条目,并像这样组合结果:

SELECT 'A' AS A, count(*) from USER.A UNION  
. 
. 
.
SELECT 'J' AS J, count(*) from USER.J UNION
.
.
SELECT 'Z' AS 'Z' COUNT(*) from USER.Z 

我想避免以上所有的麻烦。如何以智能的方式执行此操作?

我倾向于使用
用户表
元信息视图编写查询,并首次选择实际为sql查询的文本:

SELECT 'select '''||TABLE_NAME||''', count(*) from '||TABLE_NAME||'union all' FROM USER_TABLES
在查询工具中运行它将生成一个由行组成的网格,这些行本身就是sql查询。将它们从结果网格中复制出来,粘贴到查询窗口中(删除后面的UNIONALL),然后再次运行它们,为每个表生成数据

select 'a', count(*) from a union all
select 'b', count(*) from b union all ....
为了更深入地参与并包含列名,有一个用户选项卡列视图引用了关于列的信息(例如,您可以编写一个查询,生成搜索任何varchar列的特定值的查询)

如果您真的参与其中,在字符串中使用占位符并替换它们可能会更干净:

SELECT REPLACE(REPLACE(REPLACE(

  'select ''{o}.{t}'' as tname, ''{c}'' as cname 
   from {o}.{t} where 
    {c} like ''hello%'' or 
    {c} like ''goodbye%'' union all' 

  --to add more placeholders copy paste these lines 
  --and ensure there is the same number of REPLACE 
  --as there are numbers of lines 
  , '{t}', TABLE_NAME)
  , '{c}', COLUMN_NAME)
  , '{o}', OWNER)

FROM ALL_TAB_COLUMNS
WHERE DATA_TYPE = 'VARCHAR'
这比一直使用| |串联来启动和停止字符串要干净得多。我特意将外部查询大写,内部查询小写,这样您就可以知道哪个部分是哪个部分


要添加更多占位符,请添加其他替换(在顶部,复制粘贴以逗号开头的行。例如复制
,“{t}”,表名)
粘贴并更改为
,“{d}”,数据类型)
添加另一个
替换(
在顶部,现在您有了一个{d}可以在第一个字符串中的任何位置使用的占位符(sql查询模式)要表示数据类型

如何指定用户架构。例如,如果所有表都在dmart下,并且我选择了dmart.A、dmart、B等表?存在一个非用户特定的all_tables/all_TAB_COLUMNS视图集。请稍后建议我添加有关使用占位符的内容。为您需要的任何内容添加一个占位符。请记住记住,你要做的就是构建一个字符串,这个字符串恰好是一个sql,你可以直接运行;你可以决定什么数据去哪里,所以做一个
从所有表中选择*
,并考虑一下你能看到的数据,以及你想在生成你想要的数据的sql中看到的数据的哪一部分首先编写查询,然后将其转换为占位符形式