问题描述
表一:testP=================tp_idtp_titletp_content表二:testC===============tc_idtp_id//关联testP表的idtc_titletc_content我有这两张表testP可以看成是父表testC子表然后我想把testP的内容全部读取出来,然后再想统计一下阿testP中的每一个记录有多少子记录,得到一个数字!我如何用一个sql语句实现
解决方案
解决方案二:
随手敲的,可能手误SELECTp.*,ISNULL(c.CNT,0)CNTFROMtestPpLEFTJOIN(SELECTCOUNT(*)CNT,tp_idFROMtestCGROUPBYtp_id)cONp.tp_id=c.tp_id
很多人的写法会是SELECT*,(SELECTCOUNT(*)FROMtestCWHEREtp_id=p.tp_id)CNTFROMtestPp
这种写法也可以,不过,子查询与外部语句有关联,无法进行连接优化,每查一行testP的记录都会统计一次,效率比较差.
解决方案三:
selecttp_title,count(*)fromtextpaleftjointestcbona.tp_id=b.tpidgroupbytp_title
解决方案四:
先连表再聚合也可以.那就是类似于2楼朋友的写法.不过有问题的,这种写法取出的count值最小是1,因为testP表总是有记录存在.当testC表未有对应的记录时,会取到1应该count(b.tc_id),读到null时忽略,才会得到0从效率考滤,还是建议先聚合再连表.
时间: 2024-12-21 21:40:36