如何用 select 连接 2 个表并在单个查询中计数
How to join 2 tables with select and count in single query
我需要加入 2 tables(Person 和 PersonLine)。结果应包含来自 Person table 的 id
和 name
列以及每个 id
来自 PersonLine Table 的 personlineid
列的计数。但是 sql 查询 returns 总数 personlineid
。任何人都可以帮助形成 sql.
人:
ID NAME AGE
100 John 25
101 James 30
102 Janet 35
个人专线:
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
加入 Table(预期):
ID COUNT_PERSONLINE NAME
100 3 John
101 2 James
102 1 Janet
加入 Table(实际):
ID COUNT_PERSONLINE NAME
100 6 John
101 6 James
102 6 Janet
对于您的示例数据,您甚至不需要 Person
table -- 因为您似乎在两个 table 中有多余的 table。您可能应该解决这个问题,但是:
select pl.id, pl.name, count(*)
from personline pl
group by pl.id, pl.name;
您的计数只是计算 table 的 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;
我需要加入 2 tables(Person 和 PersonLine)。结果应包含来自 Person table 的 id
和 name
列以及每个 id
来自 PersonLine Table 的 personlineid
列的计数。但是 sql 查询 returns 总数 personlineid
。任何人都可以帮助形成 sql.
人:
ID NAME AGE
100 John 25
101 James 30
102 Janet 35
个人专线:
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
加入 Table(预期):
ID COUNT_PERSONLINE NAME
100 3 John
101 2 James
102 1 Janet
加入 Table(实际):
ID COUNT_PERSONLINE NAME
100 6 John
101 6 James
102 6 Janet
对于您的示例数据,您甚至不需要 Person
table -- 因为您似乎在两个 table 中有多余的 table。您可能应该解决这个问题,但是:
select pl.id, pl.name, count(*)
from personline pl
group by pl.id, pl.name;
您的计数只是计算 table 的 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;