0

次のように、T1とT2の2つのテーブルがあります。

CATEGORY     ID
1           1100
1           1200
1           1300
1           1500 
2           2000
2           2100
2           2300
2           2500

私は知る必要がある :

  • T1 と T2 の間で類似している行の数 (同じ CATEGORY と ID)
  • T1 にない T2 の行数
  • T1 から T2 にない行の数

私は今朝から頭を抱えていて、同様の行を取得するためにそれをやろうとしました:

select count(*) from T1, T2 WHERE 
T1.CATEGORY = T2.CATEGORY AND T1.ID = T2.ID; 

しかし、一意の行を取得する方法がわかりません (T1 または T2 のみ)。

4

3 に答える 3

5

質問1

SELECT  COUNT(*) totalCount
FROM    T1 a 
        INNER JOIN T2 b
            ON a.Category = b.Category AND
                a.ID = b.ID

質問 2 (使用LEFT JOIN)

SELECT  COUNT(*) totalCount
FROM    T2 a 
        LEFT JOIN T1 b
            ON a.Category = b.Category AND
                a.ID = b.ID
WHERE   b.Category IS NULL

質問 3 (使用LEFT JOIN)

SELECT  COUNT(*) totalCount
FROM    T1 a 
        LEFT JOIN T2 b
            ON a.Category = b.Category AND
                a.ID = b.ID
WHERE   b.Category IS NULL
于 2012-12-22T14:46:11.280 に答える
0

行が別個のものであると想定できない場合は、少し異なるアプローチを取る必要があります。重複行を考慮して、3 つの質問すべてに同時に答える方法を次に示します。

select (case when isT1 = 1 and isT2 = 0 then 'BOTH'
             when isT1 = 1 then 'T1-Only'
             else 'T2-Only'
        end) as WhereRow,
       count(*) as NumDistinctRows,
       sum(cnt) as NumTotalRows
from ((select category, id, count(*) as cnt, 1 as isT1, 0 as isT2
       from t1
       group by category, id
      ) union all
      (select category, id, count(*) as cnt, 0 as isT1, 1 as isT2
       from t2
       group by category, id
      )
     ) t
group by isT1, isT2
于 2012-12-22T15:46:59.450 に答える