如何在单个查询中使用select和count连接2个表

时间:2015-06-15 02:05:38

标签: sql oracle left-join

我需要加入2个表(Person和PersonLine)。结果应包含Person表中的idname列以及每个personlineid的PersonLine表中id列的计数。但是sql查询返回所有personlineid的计数。任何人都可以帮助形成sql。

人:

ID          NAME            AGE
100         John            25
101         James           30
102         Janet           35

PersonLine:

ID          NAME            PERSONLINEID
100         John            1
100         John            2
100         John            3
101         James           1
101         James           2
102         Janet           1

SQL:

SELECT P.ID, CNT.COUNT_PERSONLINE, P.NAME 
    FROM PERSON P 
    LEFT JOIN PERSONLINE PL 
    ON P.ID = PL.ID,
    (SELECT count(PL.PERSONLINEID) cnt FROM PERSON P LEFT JOIN PERSONLINE PL ON P.ID = PL.ID WHERE 
    P.ID = PL.ID) cnt

加入表(预期):

ID              COUNT_PERSONLINE            NAME
100             3                           John
101             2                           James
102             1                           Janet

加入表(实际):

ID              COUNT_PERSONLINE            NAME
100             6                           John
101             6                           James
102             6                           Janet

1 个答案:

答案 0 :(得分:5)

使用您的示例数据,您甚至不需要Person表 - 因为您似乎在两个表中有冗余表。你应该解决这个问题,但是:

select pl.id, pl.name, count(*)
from personline pl
group by pl.id, pl.name;

您的计数只是计算表中join的所有行 - 这将是所有行。即使您认为仍然需要join,简单的聚合就足够了。

编辑:

persons中有很多列可供选择。一种方法是将它们放在group by

select pl.id, pl.name, p.col1, p.col2, count(*)
from persons p join
     personline pl
     on p.id = pl.id
group by pl.id, pl.name, p.col1, p.col2

另一种方法是在join

之前进行聚合
select p.*, pl.cnt
from person p join
     (select pl.id, pl.name, count(*) as cnt
      from personline pl
      group by pl.id, pl.name
     ) pl
     on p.id = pl.id;

或者,相关子查询:

select p.*, (select count(*) from personline pl where p.id = pl.id)
from person;