2012-01-31 136 views
0

我有表A,表B和表C.基本連接和聚合?

我想從表A中選擇2個字段,表B中的一個字段(這兩個之間的內部聯接,我假設)和每個記錄的計數其中上表B中的標識上表C.發現

那麼我會有:

OpeartiveId | OperativeNumber | JobLocation | CountOfJobIdInWorkTable 

編輯:

Operative 
OperativeId 
OperativeNumber 

Jobs 
JobId 
JobLocation 

Work 
JobId 
OperativeId 

回答

2

假設你也想從a和b了C沒有匹配的記錄,你需要一個外部記錄聯接:

select a.pk_a, b.pk_b, count(c.pk_c) 
from a 
inner join b on a.pk_a = b.pk_a 
left outer join c on b.pk_b = c.pk_b 
group by a.pk_a, b.pk_b; 
+0

非常感謝弗蘭克,實際上是這樣。你的意思是讀數(c.pk_c)嗎? – SkonJeet 2012-01-31 21:08:51

+0

這不是嚴格需要的(因爲在我的測試模式中,只有c表包含列pk_c),但爲了清晰起見,我添加了它 - 謝謝。 – 2012-01-31 21:09:47

+0

所以這可能是數(*)?或者你的腳本的count()部分是表達對錶c執行計數的一種方式,因此不知何故需要用表c來識別計數?你是通過使用c唯一的一列來做到這一點的嗎?再次感謝弗蘭克,非常感謝。 – SkonJeet 2012-01-31 21:11:25

-1
select a.a,a.b,b.a,(select count(*) from c where c.b_id = b.id) 
from a 
join b on a.b_id = b.id 
+0

相關子查詢是sql反模式。它們比使用左連接慢得多。 – HLGEM 2012-01-31 21:38:19

1

翻譯給你的實際模式,並嘗試:

select a.one, a.two, b.three, count(c.id) 
from a 
join b on a.id=b.id 
left join c on c.bid=b.id 
group by a.one, a.two, b.three, b.id 
+0

太棒了!非常感謝。 – SkonJeet 2012-01-31 21:06:01

+0

這是我首先回答的問題,但如果c沒有任何出價記錄,會發生什麼情況 – bebonham 2012-01-31 21:06:16

+0

您需要使用c的外部聯接(請參閱我的答案)。 – 2012-01-31 21:08:45

1

不知道這是你在找什麼。看着你提供的提交我想出了這個。

select o.operativeId, o.OperativeNumber, j.JobLocation, COUNT(w.jobId) 
from dbo.Operative o 
Inner join works w 
    ON o.OperativeID = w.OperativeId 
INNER JOIN jobs j 
ON w.jobId = j.jobId 
GROUP by o.operativeId, o.OperativeNumber, j.JobLocation