首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2012-03-08 
三表交叉查询我有三个数据库表,现在想交叉查询表一,基本表(jb)IDname1张三2李四表二 生育情况表(sy)PERSON

三表交叉查询
我有三个数据库表,现在想交叉查询
表一,基本表(jb)
ID name
1张三
2李四
表二 生育情况表(sy)
PERSONID XHDATE
1 20100101
120110101
220030101
表三 身体健康检查表(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我 追问首……

热点排行