计算联接返回的行数

时间:2019-09-17 08:14:44

标签: sql oracle join count numbers

我想为每个不同的id计算联接中返回的每一行的数目,但是例如,我不知道该怎么做

SELECT a.ticket_id, a.class, a.create, b.info, b.info_count
FROM a
LEFT JOIN b
ON a.ticket_id = b.ticket_id
ticket_id info_count
--------- ----------
    1         1
    1         2
    2         1
    2         2
    2         3
    3         1
    3         2
    3         3
    3         4

有没有办法做到这一点?有人可以帮我吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

使用count()group by

SELECT a.ticket_id,count(b.info_count)
FROM a LEFT JOIN b
ON a.ticket_id = b.ticket_id
group by a.ticket_id

或者如果您想为每个ID计数,也可以使用row_number()

SELECT a.ticket_id, a.class, a.create, b.info, b.info_count,
row_number() over(partition by a.ticket_id order by a.create) as cnt
FROM a
LEFT JOIN b
ON a.ticket_id = b.ticket_id

答案 1 :(得分:0)

这取决于您所说的“返回行”。如果您指的是行数,则可以使用:

SELECT a.ticket_id, COUNT(*) as cnt
FROM a LEFT JOIN
     b
     ON a.ticket_id = b.ticket_id
GROUP BY a.ticket_id;

cnt个值的总和将成为结果集中的总行。

如果您的意思是“匹配b中的行”,那将是Fahmi的答案:

SELECT a.ticket_id, COUNT(b.ticket_id) as cnt
FROM a LEFT JOIN
     b
     ON a.ticket_id = b.ticket_id
GROUP BY a.ticket_id;

cnt的总和将不包含b中不匹配的行。

如果这是您想要的,那么它可能会更快(值得测试):

select a.ticket_id,
       (select count(*) from b where a.ticket_id = b.ticket_id) as cnt
from a;

尤其是,这可以有效利用b(ticket_id)上的索引-该索引对所有查询都有用。