如何在单个查询中使用选择和计数连接2个表

Jav*_*ser 0 sql oracle left-join

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

人:

ID          NAME            AGE
100         John            25
101         James           30
102         Janet           35
Run Code Online (Sandbox Code Playgroud)

人员专线:

ID          NAME            PERSONLINEID
100         John            1
100         John            2
100         John            3
101         James           1
101         James           2
102         Janet           1
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

联接表(预期):

ID              COUNT_PERSONLINE            NAME
100             3                           John
101             2                           James
102             1                           Janet
Run Code Online (Sandbox Code Playgroud)

联接表(实际):

ID              COUNT_PERSONLINE            NAME
100             6                           John
101             6                           James
102             6                           Janet
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

使用样本数据,您甚至不需要Person表-因为您似乎在两个表中都有冗余表。您可能应该解决此问题,但是:

select pl.id, pl.name, count(*)
from personline pl
group by pl.id, pl.name;
Run Code Online (Sandbox Code Playgroud)

您的计数只是计算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
Run Code Online (Sandbox Code Playgroud)

另一种方法是在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;
Run Code Online (Sandbox Code Playgroud)

或者,一个相关的子查询:

select p.*, (select count(*) from personline pl where p.id = pl.id)
from person;
Run Code Online (Sandbox Code Playgroud)