SQL 多表之间的查询,同一字段多个条件。

有表hr_epm_main hr_epm_cert
cno cname cno name

01 张磊 01 身份证
02 李强 01 驾驶证
03 张伟 01 健康证
04 王强 02 身份证
。。。。 02 驾驶证
02 劳保证
03 身份证
03 健康证
03 学生证
04 身份证
04 驾驶证
04 劳保证
04 健康证
。。。。。。。
cno 字段相关联 需要查出 同时拥有身份证、驾驶证、健康证的人 或者 同时拥有身份证、劳保证的人 或者查出同时拥有所有证件的人 查询条件不固定 证书类型不限可能还有其他证件。 求大神解答。

可以分两种语句

--1.查询有某指定证件组合的人,下列就是同时身份证、驾驶证、健康证的人 或者  同时拥有身份证、劳保证的人

select a.cno,a.cname
from hr_epm_main a
inner join hr_epm_cert b on a.cno=b.cno
group by a.cno,a.cname
having sum(case when b.name in('身份证','驾驶证','健康证') then 1 esle 0 end)=3
    or sum(case when b.name in('身份证','劳保证') then 1 esle 0 end)=2

如果你想查询同时拥有身份证、驾驶证、健康证、劳保证。可以在语句后面继续添加OR,例如

or sum(case when b.name in('身份证','驾驶证','健康证','劳保证') then 1 esle 0 end)=4 此时必须等于4,因为必须同时要满足有4本证。 希望这样写你能明白这语句

--2.查询拥有所有证件的人

select a.cno,a.cname
from hr_epm_main a
inner join hr_epm_cert b on a.cno=b.cno
inner join (select zhengjianSum=count(distinct name) from hr_epm_cert) c on 1=1
group by a.cno,a.cname,c.zhengjianSum
having sum(1)=c.zhengjianSum

上述语句:select zhengjianSum=count(distinct name) from hr_epm_cert 的意思是。系统总的证件类型有多少本。加入有10本。那么上述语句就是同时拥有这10本证的人。

 

希望这样的回答能帮助到你,谢谢!

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-12-20
这是我查询出来的答案.比楼上的好,可不用修改语句,一直使用。
当然你问的问题也有问题。
1.你是问查询必须持有2证的人
2.还是说如果有证件就查询出来
3.还是说查询拥有2证以上的人?
4.如果查询固定证件,可以使用楼上的,如果证件不固定,而且以后不想修改就用我的
select t1.id,t1.name,t2.name from Table_1 t1
right join Table_2 t2 on t1.id=t2.id
group by t1.name,t1.id,t2.name

id name name
1 张涛 军官证
1 张涛 身份证
1 张涛 学生证
2 王黎明 军官证
2 王黎明 身份证
3 胡汉三那 有计征
第2个回答  2013-12-15
你可以利用下边这个例子句型查询自己想要的,你这种不可知情况的问题,我觉得真正的一个答案不太可能
select a.cname,b.name from hr_epm_main a,hr_epm_cert b where a.cno=b.cno and b.name='身份证' and b.name='驾驶证';
这个句子的意思是查询出同时拥有身份证和驾驶证的人,希望能帮到你
相似回答