tags:

views:

7717

answers:

13

Ho to all! How can I select count(*) fro two different tables (call them tab1 and tab2) having as resulta:

Count_1   Count_2
123       456

? I've tried this:

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

but all i have is:

Count_1
123
456

Thanx in advance

+31  A: 
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual
Quassnoi
Thank you very much, quassnoi
why do you need dual? what does that mean?
codemeit
It's a fake table with one record. You can't have SELECT without FROM in Oracle.
Quassnoi
dual is a table in oracle db's to which all accounts can accessyou can use it for common needs like:"SELECT sysdate FROM dual"
dincer80
@Quassnoi, oh I see for Oracle. 1up
codemeit
Dont you think using SELECT COUNT(1) is a bit more efficient than SELECT COUNT(*)?
codemeit
It makes no difference, Oracle won't evaluate anything inside COUNT(*).
Quassnoi
@Quassnoi, thanks.
codemeit
The DUAL table is my number one annoyance with Oracle SQL: http://stackoverflow.com/questions/282329/what-are-five-things-you-hate-about-your-favorite-language/564388#564388
Jon Ericson
Use any table you want then - (ALL_TABLES WHERE ROWNUM = 1) whatever.But Dual in 10g has no i/o
+1  A: 
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
Jens Schauder
A: 

A quick stab came up with:

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

[Note: I tested this in SQL Server, so From Dual is not necessary (hence the discrepancy)]

CJM
Jeez, I give the same answer as Nic, yet someone sees fit to vote down. Furthermore, since I don't know much about Oracle, this is the best answer I can give; yet it (apart from a syntactical difference) is almost identical to the preferred answer. What gives?
CJM
+10  A: 

As an additional info, to accomplish same thing in SQL Server, you just need to remove "FROM dual" part of the query.

dincer80
@dincer80 thanks for your comment reply.
codemeit
you're welcome..
dincer80
+2  A: 

My experience is with SQL Server, but could you do:

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

In SQL Server I get the result you are after.

Nic Wise
A: 

If the tables (or at least a key column) are of the same type just make the union first and then count.

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

Or take your satement and put another sum() around it.

select sum(amount) from
(
select count(*) amount from schema.tab1 union all select count(*) amount from schema.tab2
)
+1  A: 

Just because it's slightly different:

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

It gives the answers transposed (one row per table instead of one column), otherwise I don't think it's much different. I think performance-wise they should be equivalent.

Mike Woodhouse
You'd better put UNION ALL here.
Quassnoi
What difference could adding "ALL" make with three single row queries? The results must be the same either way, surely?
Mike Woodhouse
UNION without ALL groups results. If there are 2 rows in table_1 and table_2, and 3 rows in table_3, you'll get two rows in your resultset, and won't be able to tell from resultset how many rows does table_2 have: 2 or 3.
Quassnoi
Yes, but I select the table name, which makes the results unique. Otherwise you'd be correct, but what value would there be in several numbers without context? ;-)
Mike Woodhouse
Yes, you're right, didn't notice the table name :)
Quassnoi
+1  A: 

Other slightly different methods:

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
/
David Aldridge
A: 

As I can't see any other answer bring this up.

If you don't like sub-queries and have primary keys in each table you can do this:

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

But performance wise I believe that Quassnoi's solution is better, and the one I would use.

Jimmy Stenke
A: 

Thanks a lot.. Was looking for a solution to this

A: 

SELECT (SELECT COUNT() FROM table1) + (SELECT COUNT() FROM table2) FROM dual;

A: 

Here is from me to share

Option 1 - counting from same domain from different table

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

Option 2 - counting from different domain for same table

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

Option 3 - counting from different domain for same table with "union all" to have rows of count

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

Enjoy the sql, I always do :)

Fadzil
A: 

For a bit of completeness - this query will create a query to give you a count of all of the tables for a given owner.

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;

The output is something like

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

Which you can then run to get your counts. Its just a handy script to have around sometimes

Chris Gill