【发布时间】:2016-07-19 18:10:41
【问题描述】:
我正在尝试从大约 5 个模式中的每个表的每一列中获取数据样本。下面是我仅从 1 个架构中获取此数据的示例(将“sde”替换为您要运行的架构)。这件作品运行良好:
select CASE when
lead(ROWNUM) over(order by ROWNUM) is null then
'select '||''''||T.TABLE_NAME||''''||' as TABLE_NAME,'||''''||T.COLUMN_NAME||''''||' as COLUMN_NAME, cast('|| T.COLUMN_NAME ||' as
VarChar2(50)) as SAMPLE_DATA from sde.'||T.TABLE_NAME ||' where '||T.COLUMN_NAME||' is not null and ROWNUM=1;'
else
'select '||''''||T.TABLE_NAME||''''||' as TABLE_NAME,'||''''||T.COLUMN_NAME||''''||' as COLUMN_NAME, cast('|| T.COLUMN_NAME ||' as
VarChar2(50)) as SAMPLE_DATA from sde.'||T.TABLE_NAME ||' where '||T.COLUMN_NAME||' is not null and ROWNUM=1 union all' end as qry_txt
from all_tab_columns t where T.OWNER='SDE' and T.DATA_TYPE != 'BLOB' and T.DATA_TYPE != 'LONG'
ORDER BY ROWNUM asc, qry_txt asc
当上面的结果集运行时,这里是输出的 1 行示例:
select 'HUD_TYPE' as TABLE_NAME,'HUD_TYPE_ID' as COLUMN_NAME, cast(HUD_TYPE_ID as VarChar2(50)) as SAMPLE_DATA from sde.HUD_TYPE where HUD_TYPE_ID is not null and ROWNUM=1 union all
我面临的问题是,当我运行完整的联合集时,它永远不会完成,我一次只能运行 100 到 1000 行:
select CASE when
lead(ROWNUM) over(order by ROWNUM) is null then
'select '||''''||T.TABLE_NAME||''''||' as TABLE_NAME,'||''''||T.COLUMN_NAME||''''||' as COLUMN_NAME, cast('|| T.COLUMN_NAME ||' as
VarChar2(50)) as SAMPLE_DATA from sde.'||T.TABLE_NAME ||' where '||T.COLUMN_NAME||' is not null and ROWNUM=1;'
else
'select '||''''||T.TABLE_NAME||''''||' as TABLE_NAME,'||''''||T.COLUMN_NAME||''''||' as COLUMN_NAME, cast('|| T.COLUMN_NAME ||' as
VarChar2(50)) as SAMPLE_DATA from sde.'||T.TABLE_NAME ||' where '||T.COLUMN_NAME||' is not null and ROWNUM=1 union all' end as qry_txt
from all_tab_columns t where T.OWNER='SDE' and T.DATA_TYPE != 'BLOB' and T.DATA_TYPE != 'LONG'
ORDER BY ROWNUM asc, qry_txt asc
OFFSET 4800 ROWS FETCH NEXT 400 ROWS ONLY; --Using this method so I grab the last few hundred lines so my case statement remains valid for demo
这个特定的模式是最小的,只有 5,000 行要返回。我正在尝试为动态查询做一项不可能完成的任务吗?或者有没有一种方法可以提高效率或将其分解成循环以某种方式抓取块?尽量避免让我们的开发人员参与并创建表、ETL 等。我不是 SQL 专家,但如果我指向正确的方向,我可以破解它。 :)
提前致谢。
【问题讨论】:
-
您要解决的实际问题是什么?也许从五个模式中每个表的每一列中采样数据并不是解决实际问题的唯一解决方案(甚至可能不是最好的解决方案)。
-
当然。我创建了一个面向客户的 Tableau 报告,它提供了一种快速搜索可用表和列的方法。它包括架构、对象类型(表、视图等)、表名、列名、数据类型和注释等列。我还想将“示例数据”作为一列包含在内,它是每个表中每一列的单行数据。我知道该怎么做,但是联合集似乎与任何正常大小的数据集都挂起......希望有一些优化指针或替代方法来实现同样的效果。