如何在单个SQL查询中获取单个和多个匹配的计数

时间:2017-07-30 13:30:26

标签: sql postgresql

假设我有以下2个表,

table1
-----------
col1 | col2
-----------
a1      b1
a2      b2
a3      b2
a4      b4
a1      b1

table2
-----------
col1 | col2
-----------
a1      b1
a2      b3
a2      b2
a4      b4

在上面的例子中,table2(a1,b1)中有一条记录在table1中出现不止一次(本例中为2),table2中有两条记录((a2,b2)和(a4,b4))在table1中只出现一次。我希望table2中的记录数在表1中具有完全匹配,并且table2中的记录数在table1中具有多于1个匹配。如何在单个查询中获得此结果。如下所示: -

countOfSingleMatch | countOfMultipleMatch

    2                    1

我可以使用单独的查询来完成它,但我想在单个查询中实现这一点。

1 个答案:

答案 0 :(得分:4)

我认为您在概念上想要的是table2中的记录与table1中的另一记录匹配的次数。由于您不需要报告匹配的次数,我们可以从两个表之间考虑INNER JOIN开始。然后,我们可以按col1col2汇总并计算匹配数。最后,将其作为子查询传递,并计算每种匹配类型发生的次数。

SELECT
    SUM(CASE WHEN t.cnt = 1 THEN 1 ELSE 0 END) AS countOfSingleMatch,
    SUM(CASE WHEN t.cnt > 1 THEN 1 ELSE 0 END) AS countOfMultipleMatch
FROM
(
    SELECT t2.col1, t2.col2, COUNT(*) cnt
    FROM table2 t2
    INNER JOIN table1 t1
        ON t1.col1 = t2.col1 AND t1.col2 = t2.col2
    GROUP BY t2.col1, t2.col2
) t

<强>输出:

enter image description here

在这里演示:

Rextester