2012-05-11 149 views
2

我有一个父/子/孙类型的表关系定义如下得到计数数据:子查询中使用查询值从另一个表

表A: 的parentID 描述

tableB的: childID的 parentId的 描述

表C: grandchildID childID的 描述 项目完成

我需要编写一个查询,它将列出tableB中任何给定parentID的所有记录,以及grandchild记录的总数和已完成的grandchild记录的总数(其中itemComplete = true)。

parentID将成为where子句(select * from tableB where parentId = x)的一部分。我无法弄清楚的问题是如何从tableC中获取计数,因为计数取决于childId的当前行值。

换句话说,我需要某种形式的查询,看起来像:

select description, 
(select count (*) from tableC where childId = X) as Items, 
(select count (*) from tableC where childId = X And itemComplete = true) as CompleteItems 
from tableB where parentId=Y 

其中x是tableB的当前行的childID的。我如何在子查询中引用每行的childId以获取项目数量和项目数量?

回答

7

使用子查询是一种选择,但我更喜欢JOIN这两个表,并使用GROUP BY子句使用CASE语句来获取总计。

SELECT b.description 
     , COUNT(*) AS Items 
     , SUM(CASE WHEN c.itemComplete = true THEN 1 ELSE 0 END) AS CompleteItems 
FROM tableB b 
     LEFT OUTER JOIN tableC c ON c.childid = b.childid 
WHERE b.parentID = 'Y' 
GROUP BY 
     b.description 

如果你坚持使用原来的说法,都认为缺少的是在参考外部表tableB.childID

select description, 
(select count (*) from tableC where childId = tableB.childID) as Items, 
(select count (*) from tableC where childId = tableB.childID And itemComplete = true) as CompleteItems 
from tableB where parentId=Y 

或重新格式化

SELECT description 
     , (SELECT COUNT(*) FROM tableC WHERE childId = tableB.childID) AS Items, 
     , (SELECT COUNT(*) FROM tableC WHERE childId = tableB.childID AND itemComplete = true) AS CompleteItems 
FROM tableB 
WHERE parentId=Y 
+0

谢谢了!完美的作品。 +1替代,更好的建议与左外连接。 –

相关问题