2012-01-31 60 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