2017-03-15 60 views
0

盤點分錄,我有以下表格:SQL - 從多個表

Table A: 
+--------+ 
| name | 
+--------+ 
| name1 | 
| name2 | 
| name3 | 
+--------+ 

Table B: 
+--------+----------+ 
| name | someB | 
+--------+----------+ 
| name1 | dorem | 
| name1 | lorem | 
| name3 | ipsum | 
+--------+----------+ 

Table C: 
+--------+----------+ 
| name | someC | 
+--------+----------+ 
| name1 | dorem | 
| name2 | lorem | 
| name2 | ipsum | 
+--------+----------+ 

將如何SQL模樣數從底部的兩個表中的條目爲每個

結果應該是這樣的:

+--------+----+----+ 
| name | A | B | 
+--------+----+----+ 
| name1 | 2 | 1 | 
| name2 | 0 | 2 | 
| name3 | 1 | 0 | 
+--------+----+----+ 

回答

1

您可以在SELECT子句中使用相關子查詢:

select name, 
    (select count(*) from table2 t2 where t2.name = t1.name) as A, 
    (select count(*) from table3 t3 where t3.name = t1.name) as B 
from table1 t1 
1

首先,你必須與你的數據結構的問題。如果第一個表的名稱具有唯一標識,那麼應該在後續表中使用它。

但在任何情況下,你必須要做到的計數兩個表中name。您可以使用union allgroup by

select name, sum(a) as a, sum(b) as b 
from ((select name, 1 as a, 0 as b from t2) union all 
     (select name, 0, 1 from t3) 
    ) t 
group by name; 
+0

對於一個初學者,的描述反規範化不會非常有說服力。我可以通過在後續表格中使用唯一標識來提供更詳細的描述,以及爲什麼這很重要,哪些陷阱是不這樣做的? – ErikE

0

試試這個:

SELECT C.name, COUNT(A.name),  COUNT(B.Name) 
    FROM C 
    LEFT JOIN A ON C.name = A.name 
    LEFT JOIN B ON C.name = B.name 
    GROUP BY C.name 
0
select A.Name, B2.Nb as A, C2.Nb as B 

from A 

inner join lateral 
(
select count(*) Nb from B where B.Name=A.Name 
) B2 on 1=1 

inner join lateral 
(
select count(*) Nb from C where C.Name=A.Name 
) C2 on 1=1