2009-03-03 51 views
176

Làm thế nào tôi có thể chọn count(*) từ hai bảng khác nhau (gọi cho họ tab1tab2) có kết quả:Chọn count (*) từ nhiều bảng

Count_1 Count_2 
123  456 

Tôi đã thử điều này:

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

Nhưng tất cả những gì tôi có là:

Count_1 
123 
456 

Trả lời

255
SELECT (
     SELECT COUNT(*) 
     FROM tab1 
     ) AS count1, 
     (
     SELECT COUNT(*) 
     FROM tab2 
     ) AS count2 
FROM dual 
+0

Thank you very much, quassnoi – user73118

+9

tại sao bạn cần kép? điều đó nghĩa là gì? –

+24

Đó là một bảng giả với một bản ghi. Bạn không thể có SELECT mà không TỪ trong Oracle. – Quassnoi

4
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual; 
3

Một đâm nhanh chóng đến với:

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

Lưu ý: Tôi đã thử nghiệm này trong SQL Server, vì vậy From Dual là không cần thiết (do đó sự khác biệt).

63

Khi thông tin bổ sung, để thực hiện điều tương tự trong SQL Server, bạn chỉ cần loại bỏ phần "TỪ kép" của truy vấn.

+0

@ dincer80 cảm ơn bạn đã trả lời nhận xét của bạn. –

+0

bạn được chào đón .. – dincerm

+1

Tôi đã sẵn sàng để nói "Nhưng những gì về MS SQL, khi tôi nhìn thấy bình luận của bạn. Cảm ơn bạn đã dự đoán sự cần thiết! –

19

Kinh nghiệm của tôi là với SQL Server, nhưng bạn có thể làm:

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

Trong SQL Server tôi nhận được kết quả mà bạn đang theo đuổi.

1

Nếu các bảng (hoặc ít nhất một cột khóa) cùng loại chỉ làm cho công đoàn đầu tiên và sau đó đếm.

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

Hoặc thực hiện sự an toàn của bạn và đặt một số tiền khác() quanh nó.

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

Chỉ vì nó hơi khác nhau:

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 

Nó cung cấp cho câu trả lời hoán (một hàng cho mỗi bảng thay vì một cột), nếu không tôi không nghĩ rằng nó là nhiều khác nhau. Tôi nghĩ rằng hiệu suất-khôn ngoan họ nên được tương đương.

+1

Bạn ' d tốt hơn đặt UNION TẤT CẢ ở đây – Quassnoi

+0

Điều gì khác biệt có thể thêm "TẤT CẢ" thực hiện với ba truy vấn hàng đơn? Kết quả phải giống nhau, chắc chắn? –

+1

UNION mà không có TẤT CẢ các kết quả nhóm. Nếu có 2 hàng trong bảng_1 và bảng_2, và 3 hàng trong bảng_3, bạn sẽ nhận được hai hàng trong kết quả của mình và sẽ không thể biết từ resultset có bao nhiêu hàng có bảng_2: 2 hoặc 3. – Quassnoi

7

phương pháp hơi khác khác:

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

Như tôi không thể nhìn thấy bất kỳ câu trả lời khác mang cái này lên.

Nếu bạn không thích phụ truy vấn có khóa chính trong mỗi bảng, bạn có thể làm điều này:

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

Nhưng hiệu suất khôn ngoan Tôi tin rằng giải pháp Quassnoi là tốt hơn, và một trong những Tôi sẽ dùng.

3

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

5

Đây là từ tôi để chia sẻ

Lựa chọn 1 - đếm từ cùng một tên miền từ bảng khác nhau

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

Lựa chọn 2 - đếm từ miền khác nhau cho cùng một bảng

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

Tùy chọn 3 - đếm từ miền khác nhau cho cùng một bảng với "union all" để có dãy số

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

Thưởng thức SQL, tôi luôn luôn làm :)

1

Đối với một chút của sự hoàn chỉnh - truy vấn này sẽ tạo truy vấn để cung cấp cho bạn tổng số tất cả các bảng cho một chủ sở hữu đã cho.

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; 

Đầu ra là một cái gì đó giống như

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 

Mà sau đó bạn có thể chạy để có được số lượng của bạn. Nó chỉ là một kịch bản tiện dụng để có xung quanh đôi khi.

-1
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 
+0

Chào mừng bạn đến với StackOverflow và cảm ơn bạn đã đăng bài. Vui lòng xem [Cách trả lời] (http://stackoverflow.com/questions/how-to-answer). –

0

JOIN với các bảng khác nhau

SELECT COUNT(*) FROM ( 
SELECT DISTINCT table_a.ID FROM table_a JOIN table_c ON table_a.ID = table_c.ID ); 
1
Declare @all int 
SET @all = (select COUNT(*) from tab1) + (select count(*) from tab2) 
Print @all 

hoặc

SELECT (select COUNT(*) from tab1) + (select count(*) from tab2) 
1
--============= 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 
0

chọn (select count () từ tab1 nơi field như 'giá trị') + (select count () từ tab2 nơi field như 'giá trị') đếm

2
select 
    t1.Count_1,t2.Count_2 
    from 
(SELECT count(1) as Count_1 FROM tab1) as t1, 
(SELECT count(1) as Count_2 FROM tab2) as t2 
Các vấn đề liên quan