複数のテーブルからcount(*)を選択します


230

結果として次のcount(*)2つの異なるテーブル(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

回答:


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

14
なぜデュアルが必要なのですか?どういう意味ですか?
レイ呂

31
これは、1つのレコードを持つ偽のテーブルです。Oracleでは、FROMなしでSELECTを使用することはできません。
Quassnoi

3
デュアルは、すべてのアカウントがアクセスできるoracle dbのテーブルで、次のような一般的なニーズに使用できます。 "
select

5
違いはありません。OracleはCOUNT(*)の内部では何も評価しません。
Quassnoi

4
@Stéphane:これは、PostgreSQLでOracleコードを試したときに発生します。を失うFROM dual
Quassnoi、2016

81

追加情報として、SQL Serverで同じことを行うには、クエリの "FROM dual"部分を削除するだけです。


1
私はちょうど「あなたのコメントを見たとき、MS SQLについてはどうですか。必要性を予測していただきありがとうございます!」
Andrew Neely

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つの列ではなく、テーブルごとに1つの行)。パフォーマンス的には同等だと思います。


1
ここにUNION ALLを入れた方がいいです。
Quassnoi

3つの単一行クエリで "ALL"を追加するとどのような違いがありますか?どちらにしても同じ結果になるはずですよね?
Mike Woodhouse

1
ALLグループなしのUNIONの結果。table_1とtable_2で2行、3行がtable_3である場合、あなたはあなたの結果セットに2列を得るでしょう、とtable_2が持っているんどのように多くの行の結果セットから伝えることができません:2または3
Quassnoi

4
はい、ただし結果を一意にするテーブル名を選択します。そうでなければあなたは正しいでしょうが、文脈なしでいくつかの数字にどのような価値があるでしょうか?;-)
マイクウッドハウス

これは、各カウントに対してCTE(WITH SELECT)ステートメントを使用するための良い方法でもあります。
blue_chip

28

私の経験はSQL Serverに関するものですが、次のことができます。

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

SQL Serverでは、あなたが求めている結果が得られます。


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

しかし、パフォーマンスに関しては、Quasnoiのソリューションの方が優れていると私は信じています。


7

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


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-「union all」を使用して同じテーブルの異なるドメインからカウントし、カウントの行を含める

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

SQLを楽しんでください、私はいつもします:)




6

簡単なスタブは思いつきました:

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

注:私はこれをSQL Serverでテストした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
       )

または、あなたの飽食を取り、その周りに別のsum()を置きます。

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

select(select count()where tab1 where fieldlike 'value')+(select count()like tab2 where fieldlike 'value')count


-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へようこそ。投稿いただきありがとうございます。回答方法をご覧ください。
Serge Belov、

この答えは間違っています。unionは使用できません(union allを使用する必要があります)。
Deadsheep39
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.