2016-03-31 21 views
0

, bu yüzden belirli bir kategoriye giren çok sayıda tablom var. Bu tabloların hepsi B1T ile başlar (bu yüzden B1T00001, B1T0002 vb.). Bu setler hakkında bazı bilgiler vermekle görevlendirildim.Bir sorguda birden çok tablo için satır sayısını sayın

İşte ilk SQL'im, kaç tane B1T tablosunun olduğunu öğrenmek için.

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

Bu, yaklaşık 260 tabloyu döndürür. Kombine edilen tüm tablolar için satır sayısını saymaya çalışıyorum. Ya sorgu, sayıyı tabloya bölebilir, muhtemelen toplam sayım için bir toplama kullanın; ya da her şey için tek bir sayı yaparak.

Aramamdaki bazı çözümlere bakmayı denedim, ancak sorguladığım tablo sayısı göz önüne alındığında biraz sıkıcı kod gerektiriyor.

Herhangi bir yardım büyük ölçüde takdir edilecektir!

Şu anda SQL geliştiricisini kullanıyorum.

+0

Bu RDBMS nedir? –

+0

RDBMS, Oracle –

+0

Çok kötü. SQL Server çözümüm var. –

cevap

3

Sizin için bir sorgu oluşturacak bir sorgu oluşturun. Örneğin
bu sorgu: Sadece bu sonucu kopyalamak şimdi

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 

Ve size müşteri (SQL-Geliştirici vb) yapıştırın ve çalıştırın:

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%' 
; 

böyle bir sonuç üretecektir .
İstediğiniz alacak sonuçları:

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

Bu, SQL Server çözümüme çok benzer. Tüm Oracle sözdizimini unuttum bile! İyi iş! –

1

Oracle hangi sürümünü? Oracle 12, bir cümlede işlevlere izin verir;

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; 
/

sonra, bunu derleme kullanmak: böylece olası bir çözüm böyle, önce derlemek gereken bir PL/SQL fonksiyonu ile aynı şeyi yapabilirsiniz, daha önceki sürümlerinde

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%' 

olduğunu Yukarıdaki ile aynı olan bir SELECT ifadesi. Yalnızca genel toplamı gerekiyorsa

, sen alt sorgu ilk kod parçacığı gösterilen sorgu

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

kullanabilirsiniz.

İlgili konular