कई तालिकाओं से गिनती (*) का चयन करें


229

परिणाम के रूप में मैं count(*)दो अलग-अलग तालिकाओं से कैसे चुन सकता हूं (उन्हें कॉल करें tab1और tab2):

Count_1   Count_2
123       456

मैंने यह कोशिश की है:

select count(*) Count_1 from schema.tab1 union all select count(*) Count_2 from schema.tab2

लेकिन मेरे पास सब कुछ है:

Count_1
123
456

जवाबों:


327
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual

14
आपको दोहरे की आवश्यकता क्यों है? इसका क्या मतलब है?
रे लू

31
यह एक रिकॉर्ड के साथ एक नकली तालिका है। आप Oracle में FROM के बिना चयन नहीं कर सकते।
क्वासोनी

3
ड्यूल ऑरेकल डीबी में एक टेबल है, जिसके लिए सभी खाते तक पहुँच सकते हैं, आप इसे आम जरूरतों के लिए उपयोग कर सकते हैं जैसे: "सिलेक्ट सीसडेट डबल से"
डिनरर्म

5
इससे कोई फर्क नहीं पड़ता, Oracle COUNT (*) के अंदर किसी चीज़ का मूल्यांकन नहीं करेगा।
क्वासोनि

4
@ स्टीफन: यह तब होता है जब आप PostgreSQL पर ओरेकल कोड की कोशिश करते हैं। हारना FROM dual
क्वासोइ

81

अतिरिक्त जानकारी के रूप में, SQL सर्वर में एक ही चीज़ को पूरा करने के लिए, आपको बस क्वेरी के "FROM दोहरे" भाग को हटाने की आवश्यकता है।


1
मैं बस कहने के लिए तैयार हो रहा था "लेकिन एमएस एसक्यूएल के बारे में क्या, जब मैंने आपकी टिप्पणी को देखा। जरूरत की आशंका के लिए धन्यवाद!
एंड्रयू नीली

40

सिर्फ इसलिए कि यह थोड़ा अलग है:

SELECT 'table_1' AS table_name, COUNT(*) FROM table_1
UNION
SELECT 'table_2' AS table_name, COUNT(*) FROM table_2
UNION
SELECT 'table_3' AS table_name, COUNT(*) FROM table_3

यह उत्तरों को ट्रांसपोज़्ड (एक कॉलम के बजाय एक तालिका प्रति पंक्ति) देता है, अन्यथा मुझे नहीं लगता कि यह बहुत अलग है। मुझे लगता है कि प्रदर्शन-वार उन्हें समकक्ष होना चाहिए।


1
बेहतर होगा कि आप यहाँ सभी को UNION डालें।
क्वासोनी

तीन एकल पंक्ति प्रश्नों के साथ "ALL" बनाने में क्या अंतर हो सकता है? परिणाम निश्चित रूप से उसी तरह होना चाहिए, निश्चित रूप से?
माइक वुडहाउस

1
सभी समूहों के परिणाम के बिना यूनिअन। यदि तालिका 2 और तालिका 2 में 2 पंक्तियाँ हैं, और तालिका_3 में 3 पंक्तियाँ हैं, तो आपको अपने परिणाम में दो पंक्तियाँ मिलेंगी, और परिणाम से यह बताने में सक्षम नहीं होंगे कि तालिका 2 में कितनी पंक्तियाँ हैं: 2 या 3.
क्वासोई

4
हां, लेकिन मैं तालिका नाम का चयन करता हूं, जो परिणामों को अद्वितीय बनाता है। अन्यथा आप सही होंगे, लेकिन बिना संदर्भ के कई संख्याओं में क्या मूल्य होगा? ;-)
माइक वुडहाउस

यह प्रत्येक गणना के लिए सीटीई (सेलेक्ट के साथ) स्टेटमेंट का उपयोग करने का एक अच्छा तरीका है।
blue_chip

28

मेरा अनुभव SQL सर्वर के साथ है, लेकिन क्या आप ऐसा कर सकते हैं:

select (select count(*) from table1) as count1,
  (select count(*) from table2) as count2

SQL सर्वर में मुझे वह परिणाम मिलता है जो आप बाद में हैं।


11

अन्य थोड़ा अलग तरीके:

with t1_count as (select count(*) c1 from t1),
     t2_count as (select count(*) c2 from t2)
select c1,
       c2
from   t1_count,
       t2_count
/

select c1,
       c2
from   (select count(*) c1 from t1) t1_count,
       (select count(*) c2 from t2) t2_count
/

7

जैसा कि मैं किसी अन्य उत्तर को नहीं देख सकता।

यदि आपको उप-प्रश्न पसंद नहीं हैं और आपकी प्रत्येक तालिका में प्राथमिक कुंजियाँ हैं, तो आप ऐसा कर सकते हैं:

select count(distinct tab1.id) as count_t1,
       count(distinct tab2.id) as count_t2
    from tab1, tab2

लेकिन प्रदर्शन के लिहाज से मेरा मानना ​​है कि क्वासोई का समाधान बेहतर है, और जिसका मैं उपयोग करूंगा।



7

यहाँ मुझे साझा करने के लिए है

विकल्प 1 - विभिन्न तालिका से एक ही डोमेन से गिनती

select distinct(select count(*) from domain1.table1) "count1", (select count(*) from domain1.table2) "count2" 
from domain1.table1, domain1.table2;

विकल्प 2 - एक ही तालिका के लिए अलग डोमेन से गिनती

select distinct(select count(*) from domain1.table1) "count1", (select count(*) from domain2.table1) "count2" 
from domain1.table1, domain2.table1;

विकल्प 3 - गिनती की पंक्तियों के लिए "संघ सभी" के साथ एक ही तालिका के लिए अलग-अलग डोमेन से गिनती

select 'domain 1'"domain", count(*) 
from domain1.table1 
union all 
select 'domain 2', count(*) 
from domain2.table1;

एसक्यूएल का आनंद लें, मैं हमेशा करता हूं :)




6

एक त्वरित छुरा साथ आया:

Select (select count(*) from Table1) as Count1, (select count(*) from Table2) as Count2

नोट: मैंने इसे SQL सर्वर में परीक्षण किया है, इसलिए From Dualयह आवश्यक नहीं है (इसलिए विसंगति)।


5

पूर्णता के लिए - यह क्वेरी आपको दिए गए स्वामी के लिए सभी तालिकाओं की गणना करने के लिए एक क्वेरी बनाएगी।

select 
  DECODE(rownum, 1, '', ' UNION ALL ') || 
  'SELECT ''' || table_name || ''' AS TABLE_NAME, COUNT(*) ' ||
  ' FROM ' || table_name  as query_string 
 from all_tables 
where owner = :owner;

आउटपुट कुछ इस तरह है

SELECT 'TAB1' AS TABLE_NAME, COUNT(*) FROM TAB1
 UNION ALL SELECT 'TAB2' AS TABLE_NAME, COUNT(*) FROM TAB2
 UNION ALL SELECT 'TAB3' AS TABLE_NAME, COUNT(*) FROM TAB3
 UNION ALL SELECT 'TAB4' AS TABLE_NAME, COUNT(*) FROM TAB4

जिसे आप फिर अपनी गिनती प्राप्त करने के लिए चला सकते हैं। यह कभी-कभी एक आसान स्क्रिप्ट है।


4

यदि टेबल (या कम से कम एक कुंजी स्तंभ) एक ही प्रकार के हैं, तो पहले संघ बनाएं और फिर गणना करें।

select count(*) 
  from (select tab1key as key from schema.tab1 
        union all 
        select tab2key as key from schema.tab2
       )

या अपना सैटमेंट लें और उसके चारों ओर एक और राशि () डालें।

select sum(amount) from
(
select count(*) amount from schema.tab1 union all select count(*) amount from schema.tab2
)

3
--============= FIRST WAY (Shows as Multiple Row) ===============
SELECT 'tblProducts' [TableName], COUNT(P.Id) [RowCount] FROM tblProducts P
UNION ALL
SELECT 'tblProductSales' [TableName], COUNT(S.Id) [RowCount] FROM tblProductSales S


--============== SECOND WAY (Shows in a Single Row) =============
SELECT  
(SELECT COUNT(Id) FROM   tblProducts) AS ProductCount,
(SELECT COUNT(Id) FROM   tblProductSales) AS SalesCount

2
Declare @all int
SET @all = (select COUNT(*) from tab1) + (select count(*) from tab2)
Print @all

या

SELECT (select COUNT(*) from tab1) + (select count(*) from tab2)

0

विभिन्न तालिकाओं के साथ शामिल हों

SELECT COUNT(*) FROM (  
SELECT DISTINCT table_a.ID  FROM table_a JOIN table_c ON table_a.ID  = table_c.ID   );

0

(चुनिंदा गणना (चयन tab1 से) जहां field'मान' की तरह) (चुनिंदा गिनती (+ जहां tab2 से) fieldकी तरह 'मान') गिनती


-2
select @count = sum(data) from
(
select count(*)  as data from #tempregion
union 
select count(*)  as data from #tempmetro
union
select count(*)  as data from #tempcity
union
select count(*)  as data from #tempzips
) a

StackOverflow में आपका स्वागत है और पोस्ट करने के लिए धन्यवाद। कृपया जवाब देने के लिए एक नज़र है ।
सर्ज बेलोव

यह उत्तर गलत है। संघ का उपयोग नहीं कर सकता (सभी को संघ का उपयोग करना चाहिए)।
दधिशेप39
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.