2016-03-31 22 views
0

なので、特定のカテゴリに該当するテーブルが多数あります。これらのテーブルはすべてB1Tで始まります(したがってB1T00001、B1T0002など)。私はこの一連のテーブルに関する情報を提供することを任されています。1つのクエリで複数のテーブルの行数をカウントする

ここには、そこにあるB1Tテーブルの数を取得するための最初のSQLがあります。

select obj_nm from od_md_obj 
where proj_id = '6' and obj_nm like ('%B1T%')and obj_typ_id = '9'; 

これは約260のテーブルを返します。私はすべてのテーブルの組み合わせの行数のカウントを取得しようとしています。どちらのクエリでもテーブルごとにカウントを破ることができます。おそらく、合計カウントにロールアップを使用します。すべてを1回だけカウントするだけです。

私は検索でいくつかのソリューションを見てみましたが、クエリしているテーブルの数を考慮すると、ちょっと面倒なコードが必要でした。

ご協力いただければ幸いです!

私は現在SQLデベロッパーを使用しています。

+0

これはどのRDBMSですか? –

+0

RDBMSはOracle –

+0

です。私はSQL Serverソリューションを持っています。 –

答えて

3

クエリを生成するクエリを作成します。
たとえば、次のクエリ:

select 'SELECT ''' || table_name || ''' as table_name, count(*) As con ' || 
     'FROM ' || table_name || 
     CASE WHEN lead(table_name) OVER (order by table_name) IS NOT NULL 
     THEN ' UNION ALL ' END 
from user_tables 
where table_name like 'B1T%' 
; 

は次のように結果を生成します。

SELECT 'B1T00000' as table_name, count(*) As con FROM B1T00000 UNION ALL                                                             
SELECT 'B1T00001' as table_name, count(*) As con FROM B1T00001 UNION ALL                                                             
SELECT 'B1T00002' as table_name, count(*) As con FROM B1T00002 UNION ALL                                                             
SELECT 'B1T00003' as table_name, count(*) As con FROM B1T00003 UNION ALL                                                             
SELECT 'B1T00004' as table_name, count(*) As con FROM B1T00004 UNION ALL                                                             
SELECT 'B1T00005' as table_name, count(*) As con FROM B1T00005 UNION ALL                                                             
SELECT 'B1T00006' as table_name, count(*) As con FROM B1T00006 UNION ALL                                                             
SELECT 'B1T00007' as table_name, count(*) As con FROM B1T00007 UNION ALL                                                             
SELECT 'B1T00008' as table_name, count(*) As con FROM B1T00008 UNION ALL 
.... 
.... 
.... 
SELECT 'B1T00257' as table_name, count(*) As con FROM B1T00257 UNION ALL                                                             
SELECT 'B1T00258' as table_name, count(*) As con FROM B1T00258 UNION ALL                                                             
SELECT 'B1T00259' as table_name, count(*) As con FROM B1T00259 UNION ALL                                                             
SELECT 'B1T00260' as table_name, count(*) As con FROM B1T00260 

そして今ちょうど、この結果をコピーし、あなたのクライアント(SQL-開発者など)に貼り付けて、それを実行します。
あなたは望ましい結果を取得します:オラクルのバージョン

TABLE_NAME  CON 
---------- ---------- 
B1T00000   65 
B1T00001   66 
B1T00002   67 
B1T00003   68 
B1T00004   69 
... 
... 
... 
B1T00256   321 
B1T00257   322 
B1T00258   323 
B1T00259   324 
B1T00260   325 

261 rows selected 
+0

これは私のSQL Serverソリューションと非常によく似ています。私はすべての私のOracle構文を忘れてしまった!よくやった! –

1

を? Oracle 12では、with句で関数を使用できます。

CREATE OR REPLACE FUNCTION count_rows(t_name IN VARCHAR2) RETURN NUMBER 
AS 
    l_rows NUMBER; 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || t_name INTO l_rows; 
    RETURN l_rows; 
END; 
/

は、その後、それをコンパイルし、それを使用しますので、可能な解決策は、あなたがこのように、あなたが最初にコンパイルする必要があり、そのPL/SQL関数で同じことを行うことができ、以前のバージョンでは

WITH FUNCTION count_rows(t_name IN VARCHAR2) RETURN NUMBER 
AS 
    l_rows NUMBER; 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || t_name INTO l_rows; 
    RETURN l_rows; 
END; 
SELECT table_name, count_rows(table_name) as row_count 
    FROM user_tables 
    WHERE table_name LIKE 'B1T%' 

です上記と同じSELECT文。あなたが唯一の総計が必要な場合は

、あなたはサブクエリが最初のコードスニペットに示したクエリです

SELECT SUM(row_count) FROM (SELECT .....) 

を使用することができます。