2012-03-01 15 views
0

こんにちは、これらの2つのクエリを結合して、テーブルの名前、テーブルの列の数、および外部キーを持つ列の数を持つものにします。SQLは2つのクエリを1つに結合する

このクエリは、テーブル名と列数

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; 

この2つのクエリにどのように参加しますか?私はオラクルDBを使用しています。

編集:私は各テーブルの列数を選択していないと言っていました。では、DBの各テーブルの番号をどのように数えますか?

+1

私は私が従うことを確信していません。いずれのクエリも、あなたが言う結果を返しません。両方のクエリは、テーブルの制約の数を返します。どちらも外部キーに固有ではなく、テーブルの列数や外部キー制約のある列数とは関係ありません。すべての外部キー制約が複合キーではなく単一の列にあると仮定していますか? –

+0

申し訳ありません。私はちょうど2番目のクエリを更新します。これで、外部キー制約のあるすべての列が選択されるようになりました。 – serpiente

+1

all_tab_columnsから列数を取得することを意味しましたか? – Joey

答えて

2

あなたはこれがあなたの既存のクエリのいずれかを実行し、テーブル内の列数を取得していないが、どちらもしないクエリ

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

OK、キーはあなたが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 

これが役立ちます。

関連する問題