【问题标题】:SQL join two queries into oneSQL将两个查询合二为一
【发布时间】:2012-03-01 22:34:38
【问题描述】:

您好,我想加入这两个查询以得到一个包含表名、表中的列数和具有外键的列数的查询。

这个查询产生表名和列数

select t.table_name,  count(t.table_name)
from all_constraints  t 
where owner = 'PARRANDEROS' group by t.table_name;

对方查询外键计数。

select table_name,  count(constraint_type)
from all_constraints  
where owner = 'PARRANDEROS' and constraint_type ='R'group by table_name;

如何加入这两个查询?我正在使用 Oracle 数据库。

编辑:有人告诉我我没有选择每个表中的列数。那么如何计算数据库中每个表的数量呢?

【问题讨论】:

  • 我不确定我是否跟随。这两个查询都不会返回您所说的结果。两个查询都返回表上的约束数。两者都不是特定于外键的,也与表中的列数或具有外键约束的列数无关。您是否假设所有外键约束都在单列上而不是复合键上?
  • 对不起,我刚刚更新了第二个查询,现在它选择了所有具有外键约束的列。
  • 您的意思是从 all_tab_columns 获取列数吗?
  • @serpiente - 它仍然没有选择具有外键约束的列数。它正在选择表上定义的外键约束的数量。
  • @serpiente - 更新了我的答案以计算表中的列数和外键约束的数量,而不是结合两个查询。

标签: sql oracle


【解决方案1】:

您可以组合查询

SELECT table_name, 
       COUNT(*) number_of_constraints,
       SUM( CASE WHEN constraint_type = 'R' 
                 THEN 1
                 ELSE 0
              END) number_of_fk_constraints
  FROM all_constraints
 WHERE owner = 'PARRANDEROS'
 GROUP BY table_name

这不会检索表中的列数,但也不会检索您现有的任何查询。它确实返回在表上定义的约束数。这不会检索表中作为外键约束一部分的列数,但您的第二个查询也不会检索,除非我们假设所有外键约束都在单个列上定义,而不是可能在复合键上定义。

如果要统计表中的列数和表中的外键约束数(注意可能与外键约束中涉及的列数不同)

SELECT t.table_name,
       (SELECT COUNT(*)
          FROM all_tab_cols cols
         WHERE cols.owner = t.owner
           AND cols.table_name = t.table_name) number_of_columns,
       (SELECT COUNT(*)
          FROM all_constraints cons
         WHERE constraint_type = 'R'
           AND cons.owner = t.owner
           AND cons.table_name = t.table_name) number_of_constraints
  FROM all_tables t
 WHERE t.owner = 'PARRANDEROS'
 GROUP BY t.table_name

【讨论】:

    【解决方案2】:

    好的,关键是你要从 ALL_TAB_COLUMNS 中抓取列名:

    SELECT table_name, COUNT(column_name)
      FROM all_tab_columns
     WHERE owner = 'PARRANDEROS'
     GROUP BY table_name
    

    为了获得同时具有外键约束的列数,您还必须加入 ALL_CONS_COLUMNS 和 ALL_CONSTRAINTS。这些应该是外连接,因为一列可能根本没有任何约束,并且使用 DISTINCT 是因为一列可能有多个约束。

    SELECT a.table_name, COUNT(DISTINCT a.column_name) AS column_cnt
         , COUNT( DISTINCT DECODE(c.constraint_type, 'R', a.column_name || '|' || c.constraint_name, null) ) AS fk_cnt
      FROM all_tab_columns a, all_cons_columns b, all_constraints c
     WHERE a.owner = 'PARRANDEROS'
       AND a.owner = b.owner(+)
       AND a.table_name = b.table_name(+)
       AND a.column_name = b.column_name(+)
       AND b.owner = c.owner(+)
       AND b.table_name = c.table_name(+)
       AND b.constraint_name = c.constraint_name(+)
     GROUP BY a.table_name
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多