2015-06-15 34 views
0

我需要連接2個表(Person和PersonLine)。結果應包含Person表中的idname列以及PersonLine表中每個idpersonlineid列的計數。但sql查詢返回所有personlineid的計數。任何人都可以幫助形成SQL。如何在單個查詢中連接2個表並選擇計數

人:

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 

JOIN表(實際):

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

回答

4

有了您的樣本數據,你甚至都不需要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; 
+0

謝謝,我只是添加了一個樣本。 Person表中有許多列不在PersonLine表中,我需要將其顯示爲Result表。 –

+0

謝謝。第二和第三次工作。 –

相關問題