SQL多表联查的COUNT问题,请高手多指教,在线等着急 20

小弟入行不久,遇到一个问题,始终解决不了,求助各位大侠!问题详细描述:有两张表,一张staff,一张dept。staff中包含了很多的信息,姓名,拼音,号码,账号,工号,... 小弟入行不久,遇到一个问题,始终解决不了,求助各位大侠!
问题详细描述:
有两张表,一张staff,一张dept。staff中包含了很多的信息,姓名,拼音,号码,账号,工号,部门ID等很多信息。dept表包含部门ID,部门名称等。两张表通过部门ID联接。

要求输入查询条件,查询出符合条件的员工,显示其信息。查询的条件包括以上各个字段。由于这两张都是百万级别的表,因此对查询性能的要求非常高。我们输入条件后,先会判断符合条件的count的是多少,如果是0的话,就不用继续查详细的信息了。
说明:我们每个字段都建了索引。我们只是查员工信息,而不是查询部门信息。
我把数据模型简化成以下模式。
表dept:
deptid deptname
1 a1
2 a2
3 a3
4 a4

表staff:
staffname deptid
a1 1
a2 1
注意:我们只是查员工信息,而不是查询部门信息。
从这两张可以看出,当我输入条件"a"查询的时候,符合条件的是员工a1,a2,应该是显示的count为2。而不应该把部门a1,a2显示出来。再简单的讲,就是我有部门叫南京,杭州,有成员也叫南京,杭州。当我输入南京的查询的时候,我可以显示出成员南京,也可以显示出部门南京中的成员,但不能显示部门南京。有点绕,不知道是否明白?

我们原先的sql是这样的
select count(st.staffname) as cn from staff st, dept dt where
st.staffname like "a%" or
dt.deptname like "a%"
and st.deptid= dt.deptid
这样的结果是正确的2条,但这样搜索没有用到索引,是全表查询,效率极其的低下。
后来改成:
select sum(cn) as count from (
select count(st.staffname) as cn from staff st, dept dt where st.staffname like 'a%' and st.deptid= dt.deptid
union select count(st.deptname) as cn from staff st, dept dt where de.deptname like "a%" and st.deptid= dt.deptid
)
这样虽然用到了索引,效率大大提高,但结果却是4。

想请教各位大侠,这样的语句该如何写?

另注:各位大神发布答案请先explain一下,如果是全表搜,就请不要发上来了。多谢!
展开
 我来答
liutongmouse
2012-11-30 · TA获得超过375个赞
知道小有建树答主
回答量:338
采纳率:0%
帮助的人:270万
展开全部
用detp 表的 的deptname+ staff表的 staffname作为检索字段试试吧!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ZESTRON
2024-09-04 广告
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸... 点击进入详情页
本回答由ZESTRON提供
micro0369
2012-11-24 · TA获得超过1.2万个赞
知道大有可为答主
回答量:9250
采纳率:85%
帮助的人:4032万
展开全部
显然镇氏册应该先union,再核拿count:

select count(*) as count from (
select staffname,st.deptid from staff st, dept dt where st.staffname like 'a%'御宏 and st.deptid= dt.deptid
union
select staffname,st.deptid from staff st, dept dt where de.deptname like "a%" and st.deptid= dt.deptid
) aaa
追问
感谢你的支持。现在还有是问题,实在是百思不得其解,还想请教。
我这两张表的每一个字段都建过索引。select staffname,st.deptid from staff st, dept dt where st.staffname like 'a%' and st.deptid= dt.deptid
这一句是用到索引。
select staffname,st.deptid from staff st, dept dt where de.deptname like "a%" 这一句也是索引。但这一句后面加上and st.deptid= dt.deptid,却是全表搜,实在想不明白!!!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冷大胆很胆大
2012-11-23
知道答主
回答量:31
采纳率:0%
帮助的人:7万
展开全部
我不会
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式