我需要加入2个表(Person和PersonLine)。结果应包含Person表中的id
和name
列以及每个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
答案 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;