Chọn tính (*) từ nhiều bảng


230

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

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

Câu trả lời:


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

14
Tại sao bạn cần kép? điều đó nghĩa là gì?
Ray Lu

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

3
dual là một bảng trong oracle db mà tất cả các tài khoản có thể truy cập, bạn có thể sử dụng nó cho các nhu cầu phổ biến như: "CHỌN sysdate TỪ kép"
dincerm

5
Không có gì khác biệt, Oracle sẽ không đánh giá bất cứ điều gì trong COUNT (*).
Quassnoi

4
@ Stéphane: điều này xảy ra khi bạn thử mã Oracle trên PostgreSQL. Mất cái FROM dual.
Quassnoi

81

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


1
Tôi đã sẵn sàng để nói "Nhưng còn MS SQL thì sao, khi tôi thấy bình luận của bạn. Cảm ơn bạn đã lường trước nhu cầu!
Andrew Neely

40

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ó đưa ra các câu trả lời được chuyển đổi (một hàng trên mỗi bảng thay vì một cột), nếu không tôi không nghĩ nó khác nhiều. Tôi nghĩ rằng hiệu suất-khôn ngoan họ nên tương đương.


1
Bạn nên đặt UNION ALL ở đây.
Quassnoi

Sự khác biệt nào có thể thêm "TẤT CẢ" với ba truy vấn hàng đơn? Kết quả phải giống nhau, chắc chắn?
Mike Woodhouse

1
ĐOÀN không có kết quả TẤT CẢ các 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 tập kết quả của mình và sẽ không thể biết từ kết quả có bao nhiêu hàng trong bảng_2 có: 2 hoặc 3.
Quassnoi

4
Có, nhưng tôi chọn tên bảng, làm cho kết quả là duy nhất. Nếu không, bạn sẽ đúng, nhưng giá trị nào sẽ có trong một số mà không có ngữ cảnh? ;-)
Mike Woodhouse 04/03/2016

Đây cũng là một cách tốt để sử dụng câu lệnh CTE (VỚI CHỌN) cho mỗi lần đếm.
blue_chip

28

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ả bạn đang theo đuổi.


11

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

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

Vì tôi không thể thấy bất kỳ câu trả lời nào khác.

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

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

Nhưng hiệu quả khôn ngoan Tôi tin rằng giải pháp của Quassnoi là tốt hơn, và giải pháp tôi sẽ sử dụng.


7

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


7

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

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

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

Tùy chọn 2 - đếm từ các 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ừ các miền khác nhau cho cùng một bảng với "union all" để có các hàng đếm

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

Thích SQL, tôi luôn làm :)


7
    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

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

6

Một cú đâm nhanh đã xuất hiện:

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

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


5

Đối với một chút đầy đủ - truy vấn này sẽ tạo một 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 nhất định.

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 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. Đôi khi nó chỉ là một kịch bản tiện dụng.


4

Nếu các bảng (hoặc ít nhất là một cột chính) cùng loại, chỉ cần tạo liên kết trước rồi mới tính.

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

Hoặc lấy chỗ ngồi của bạn và đặt một số tiền khác () xung quanh nó.

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

hoặc là

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

0

THAM GIA 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   );

0

chọn (chọn đếm ( ) từ tab1 trong đó fieldlike 'value') + (chọn đếm ( ) từ tab2 trong đó fieldlike 'value')


-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

Chào mừng bạn đến với StackOverflow và cảm ơn bạn đã đăng bài. Xin hãy xem Làm thế nào để trả lời .
Serge Belov

Câu trả lời này là sai. Không thể sử dụng công đoàn (nên sử dụng công đoàn tất cả).
Deadsheep39
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.