SQL объединяет два запроса в один - PullRequest
0 голосов
/ 02 марта 2012

Здравствуйте, я хочу объединить эти два запроса, чтобы в итоге получить запрос с именем таблицы, количеством столбцов в таблице и количеством столбцов с внешними ключами.

Этот запрос производит имя таблицы и количество столбцов

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;

Как мне присоединиться к этим двум запросам? Я использую оракул DB.

РЕДАКТИРОВАТЬ: Некоторые сказали мне, что я не выбрал количество столбцов в каждой таблице. Так как мне посчитать номер для каждой таблицы в БД?

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Вы можете объединить запросы

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
0 голосов
/ 02 марта 2012

ОК, ключ в том, что вы хотите получить имена столбцов из 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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...