向大家求教一个 sql 语句! 简单的两个表
表一:testP
=================
tp_id
tp_title
tp_content
表二:
testC
===============
tc_id
tp_id //关联testP表的id
tc_title
tc_content
我有这两张表
testP 可以看成是父表 testC 子表
然后
我想把 testP 的内容全部读取出来,然后再想统计一下阿 testP 中的每一个记录有多少子记录,得到一个数字!我如何用一个sql语句实现 --------------------编程问答-------------------- 随手敲的,可能手误
SELECT p.*,ISNULL(c.CNT,0) CNT FROM testP p
LEFT JOIN
(SELECT COUNT(*) CNT,tp_id FROM testC GROUP BY tp_id) c
ON p.tp_id=c.tp_id
很多人的写易做图是
SELECT *,(SELECT COUNT(*) FROM testC WHERE tp_id=p.tp_id) CNT
FROM testP p
这种写法也可以,不过,子查询与外部语句有关联,无法进行连接优化,每查一行testP的记录都会统计一次,效率比较差. --------------------编程问答-------------------- select tp_title,count(*) from textp a left join testc b on a.tp_id=b.tpid group by tp_title --------------------编程问答-------------------- 先连表再聚合也可以. 那就是类似于2楼朋友的写法.
不过有问题的,这种写法取出的count值最小是1,因为 testP表总是有记录存在. 当testC表未有对应的记录时,会取到1
应该 count(b.tc_id) ,读到null时忽略, 才会得到 0
从效率考滤,还是建议 先聚合再连表.
补充:.NET技术 , ASP.NET