Jav*_*ser 0 sql oracle left-join
我需要加入2个表(Person和PersonLine)。结果应该包含id并name从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)
使用样本数据,您甚至不需要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)
| 归档时间: |
|
| 查看次数: |
1039 次 |
| 最近记录: |