当前位置: 代码迷 >> Sql Server >> 三表交叉查询,该如何处理
  详细解决方案

三表交叉查询,该如何处理

热度:55   发布时间:2016-04-27 14:21:49.0
三表交叉查询
我有三个数据库表,现在想交叉查询
表一,基本表(jb)
ID name
1 张三
2 李四
表二 生育情况表(sy)
PERSONID XHDATE
1 20100101
1 20110101
2 20030101
表三 身体健康检查表(JC)
PERSONID JCDATE JCJG
1 20111201 良好
1 20111225 一般
1 20110105 好  
2 20110101 较差
2 20110505 良好

ID 与子表的PERSONID值相同可以作为连接字段
现在我想查询出如下结果
 ID ,NAME ,SYCOUNT,JCDATE,JCJG
 1 张三 2 20111225 一般
 2 李四 1 20110505 良好
(就是汇总其生育小孩个数与最后一次检查时间与结果)
我用
SELECT JB.ID, JB.NAME,COUNT(SY.PERSONID),MAX(JC.JCDATE),MAX(JC.JCJG)
FROM JB LEFT JION SY ON JB.ID=SY.PERSONID LEFT JION JC ON JB.ID=JC.PERSONID
GROUP BY JB.ID, JB.NAME
但查询出的结果为
ID ,NAME ,SYCOUNT,JCDATE,JCJG
 1 张三 6 20111225 一般
 2 李四 2 20110505 良好
其SYCOUNT的值根据JC的PERSONID相同的记录条数进行翻倍了,请问如何解决!


------解决方案--------------------
SQL code
create table jb(  ID int,  name nvarchar(3))create table sy(  PERSONID int,  XHDATE varchar(8))create table jc(  PERSONID int,  JCDATE varchar(8),  JCJG nvarchar(2))insert into jb select 1,'张三' union allselect 2,'李四'insert into sy select 1,'20100101' union allselect 1,'20110101' union allselect 2,'20030101'insert into jc select 1,'20111201','良好' union allselect 1,'20111225', '一般' union allselect 1,'20110105', '好'   union all select 2,'20110101', '较差' union allselect 2,'20110505', '良好'select t1.ID,t1.name,SYCOUNT=(select COUNT(1) from sy where PERSONID=t1.ID),t2.JCDATE,t2.JCJG From jb t1 left join(select * from jc a where not exists (select 1 from jc where PERSONID=a.PERSONID and JCDATE>a.JCDATE)) t2 on t1.ID=t2.PERSONIDID          name SYCOUNT     JCDATE   JCJG----------- ---- ----------- -------- ----1           张三   2           20111225 一般2           李四   1           20110505 良好(2 行受影响)
------解决方案--------------------
楼上已经解决
------解决方案--------------------
SQL code
create table jb(  ID int,  name nvarchar(3))create table sy(  PERSONID int,  XHDATE varchar(8))create table jc(  PERSONID int,  JCDATE varchar(8),  JCJG nvarchar(2))insert into jb select 1,'张三' union allselect 2,'李四'insert into sy select 1,'20100101' union allselect 1,'20110101' union allselect 2,'20030101'insert into jc select 1,'20111201','良好' union allselect 1,'20111225', '一般' union allselect 1,'20110105', '好'   union all select 2,'20110101', '较差' union allselect 2,'20110505', '良好'select a.ID,max(a.name) name ,max(c.JCDATE) JCDATE,max(c.JCJG) JCJG from  jb a left join  sy b on  a.ID=b.PERSONID left join jc c on b.PERSONID=c.PERSONIDgroup by a.ID
------解决方案--------------------
探讨
left join 的意思是不管右边的条件符不符合,都参照左边,所以原本张三原本2个孩子结果为6个
select JB.ID, JB.NAME,COUNT(SY.PERSONID),MAX(JC.JCDATE),MAX(JC.JCJG)
from jb,sy,jc where jb.id=sy.personid and jb.id=jc.personid 应该可以的,不行的话,再Hi我 追问首……
  相关解决方案