如何在 Snowflake 中合并具有不同列号的两个表?

How to merge two tables with different column number in Snowflake?

我正在查询 Snowflake 信息架构中的 TABLE_SCHEMA、TABLE_NAME、CREATED、LAST_ALTERED 列。意见。接下来,我想将 table 与视图的行数合并。以下是我的查询 我是 运行 在 Snowflake 我的问题是我不确定如何将这两个 table 合并为 1 table ?

注意:我是 Snowflake 的新手。请提供代码和解释。

在此先感谢您的帮助!

查询 1

 SELECT TABLE_SCHEMA,TABLE_NAME,CREATED,LAST_ALTERED FROM DB.SCHEMA.VIEWS
WHERE TABLE_SCHEMA="MY_SHEMA" AND TABLE_NAME IN ('VIEW_TABLE1','VIEW_TABLE2','VIEW_TABLE3')

查询 2

SELECT COUNT(*) FROM DB.SCHEMA.VIEW_TABLE1
UNION ALL SELECT COUNT(*) FROM DB.SCHEMA.VIEW_TABLE2

在您的计数 (*) 查询中将 table/view 个名称作为字符串包含在内,然后您就可以加入了。

下面的例子 -

select * from
(SELECT TABLE_SCHEMA,TABLE_NAME,CREATED FROM information_schema.tables
WHERE TABLE_SCHEMA='PUBLIC' AND TABLE_NAME IN ('D1','D2')) t1
left join
(
SELECT 'D1' table_name, COUNT(*) FROM d1
UNION ALL SELECT 'D2',COUNT(*) FROM d2) t2
on t1.table_name = t2.table_name ;
TABLE_SCHEMA TABLE_NAME CREATED TABLE_NAME COUNT(*)
PUBLIC D1 2022-04-06 14:24:56.224 -0700 D1 12
PUBLIC D2 2022-04-06 14:25:27.276 -0700 D2 5

要获得 COUNT(*) 的结果,需要动态构建并附加到“驱动查询”。

示例数据:

CREATE VIEW VIEW_TABLE1(c)
AS 
SELECT 1;

CREATE VIEW VIEW_TABLE2(e)
AS 
SELECT 2 UNION ALL SELECT 4;

CREATE VIEW VIEW_TABLE3(f)
AS 
SELECT 3;

完整查询:

DECLARE 
    QUERY STRING;
    RES RESULTSET;
BEGIN
   SELECT 
    LISTAGG(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        $$SELECT  '<TABLE_SCHEMA>'   AS TABLE_SCHEMA,
                  '<TABLE_NAME>'     AS TABLE_NAME,
                  '<CREATED>'        AS CREATED,
                  '<LAST_ALTERED>'   AS LAST_ALTERED,
                  COUNT(*) AS cnt
           FROM <tab_name>
        $$,
       '<TABLE_SCHEMA>', v.TABLE_SCHEMA),
       '<TABLE_NAME>', v.TABLE_NAME),
       '<CREATED>', v.CREATED),
       '<LAST_ALTERED>', v.LAST_ALTERED),
       '<tab_name>', CONCAT_WS('.', v.table_catalog, v.table_schema, v.table_name)),
                                       
        ' UNION ALL ') WITHIN GROUP (ORDER BY CONCAT_WS('.', v.table_catalog, v.table_schema, v.table_name))
   INTO :QUERY
   FROM INFORMATION_SCHEMA.VIEWS v
   WHERE TABLE_SCHEMA='PUBLIC'
     AND TABLE_NAME IN ('VIEW_TABLE1','VIEW_TABLE2','VIEW_TABLE3');


  RES := (EXECUTE IMMEDIATE :QUERY);
  RETURN TABLE(RES);
END;

输出:


理由:

理想的查询是(伪代码):

SELECT TABLE_SCHEMA,TABLE_NAME,CREATED,LAST_ALTERED,
      EVAL('SELECT COUNT(*) FROM ' ||  view_name) AS row_count
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_SCHEMA='MY_SHEMA'
  AND TABLE_NAME IN ('VIEW_TABLE1','VIEW_TABLE2','VIEW_TABLE3');

SELECT 列表中的这种构造 EVAL(dynamic query) 不存在,因为它需要即时构建查询并按每一行执行。尽管对于某些 RDBMS 来说,解决方法是 dbms_xmlgen.getxmltype