日期:2014-05-17  浏览次数:20708 次

查询语句,求SQL,万分感谢
大家好,假设现在我有三张表:A B C
A表字段为采集点编号、采集点名称、供电单位
B表字段为采集点编号、用户编号
C表字段为用户编号、供电单位
假如A表数据如下:
3240101 采集点1 32401
3240102 采集点2 32401
3240103 采集点3 32401
3240201 采集点4 32402
3240301 采集点5 3240301
3240302 采集点6 32403
B表数据如下:
3240101 01010101
3240101 01010102
3240101 01010103
3240102 01010104
3240103 01010105
3240301 01010106
3240301 01010107
C表数据如下:
01010101 32401
01010102 32401
01010103 3240101
01010104 32402
01010105 32403
01010106 32403
01010107 32403
其中一个采集点下对应多个用户,我想查询出以下结果:
1、查询出采集点名称,条件是该采集点下对应的C表的供电单位有不一致的情况。
根据以上数据,查询结果应该是采集点1,因为该采集点对应C表供电单位不唯一,所以显示出采集点1.
2、查询出采集点名称,条件是该采集点下对应C表的供电单位必须一致但与A表对应的供电单位不一致。
根据以上数据,查询结果应该是采集点5,因为该采集点下对应C表供电单位是一致的,但与A表的供电单位不一致,所以显示采集点5.

请问大家以上SQL语句怎么写呢,谢谢大家了。
------解决方案--------------------
--1.
select 采集点名称 from (
select a.采集点名称,c.供电单位 from a,b,c
where a.采集点编号=b.采集点编号 and b.用户编号=c.用户编号
) group by 采集点名称 having count(distinct 供电单位) > 1;

--2.根据你的要求,采集点2和3也应该在结果里面.如果你不需要这种在B表中只有1条对应数据的记录,
--在最里层的查询外面加上过滤条件就好。
select 采集点名称 from (
select 采集点名称,供电单位A,max(供电单位C) 供电单位C from (
select a.采集点名称,a.供电单位 供电单位A, c.供电单位 供电单位C from a,b,c
where a.采集点编号=b.采集点编号 and b.用户编号=c.用户编号
) group by 采集点名称,供电单位A having count(distinct 供电单位C) = 1
) where 供电单位A<>供电单位C;