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


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.