查询问题,在线等待!!!
有一个表有10584条记录,我用如下查询,返回2979条记录
select zginfo.sfz
from zginfo,middle_per
where middle_per.id=zginfo.id and middle_per.name=zginfo.name and middle_per.sfz=zginfo.sfz
现在我需要另外7605条记录,写了一个procedure如下:
CREATE PROCEDURE sp_middle_per
AS
select id,name,sfz
from zginfo
where sfz not in
(select zginfo.sfz
from zginfo,middle_per
where middle_per.id=zginfo.id and middle_per.name=zginfo.name and middle_per.sfz=zginfo.sfz)
GO
却返回7582条记录,是什么地方写错了??谢谢!!
问题点数:50、回复次数:14Top
1 楼Frewin(frewin)回复于 2004-12-02 15:53:20 得分 0
CREATE PROCEDURE sp_middle_per
AS
select a.id,a.name,a.sfz
from zginfo a
where Not EXISTS
(select zginfo.sfz
from zginfo,middle_per
where middle_per.id=zginfo.id and middle_per.name=zginfo.name and middle_per.sfz=zginfo.sfz And a.sfz=zginfo.sfz )Top
2 楼Frewin(frewin)回复于 2004-12-02 15:54:22 得分 10
select id,name,sfz
from zginfo
where Isnull(sfz,'') not in
(select Isnull(zginfo.sfz ,'')
from zginfo,middle_per
where middle_per.id=zginfo.id and middle_per.name=zginfo.name and middle_per.sfz=zginfo.sfz)Top
3 楼Frewin(frewin)回复于 2004-12-02 15:55:20 得分 0
因为用 in 时,null值将忽约Top
4 楼Eddie005(♂) №.零零伍 (♂)回复于 2004-12-02 15:58:13 得分 0
null引起的Top
5 楼lsxaa(小李铅笔刀)回复于 2004-12-02 16:00:20 得分 0
︶︵︶Top
6 楼didoleo(冷月无声)回复于 2004-12-02 16:02:48 得分 0
我觉得是用FULL OUTER JOIN 或 FULL JOIN 比较好吧。Top
7 楼scorpiowell(年年岁岁花相似,岁岁年年人不同)回复于 2004-12-02 17:29:53 得分 0
FULL OUTER JOIN 或 FULL JOIN是求笛卡尔集的。
比如你想取得zginfo表的10584条记录,如果想取middle_per表的,则用RIGHT JOIN
select zginfo.sfz
from zginfo LEFT JOIN middle_per ON
middle_per.id=zginfo.id and middle_per.name=zginfo.name and middle_per.sfz=zginfo.sfz
Top
8 楼denxiaom(蛤蟆老大)回复于 2004-12-02 20:53:30 得分 0
都不行啊,我要求另外的7605条记录,也就是
select zginfo.sfz
from zginfo,middle_per
where middle_per.id=zginfo.id and middle_per.name=zginfo.name and middle_per.sfz=zginfo.sfz
之外的的记录
Top
9 楼denxiaom(蛤蟆老大)回复于 2004-12-02 21:13:34 得分 0
有没有高手啊!!!救命啊!!!
我再说详细点。表middle_per是效验表,zginfo有三个字段ID(社保号),name(姓名),sfz(身份证),通过对比效验表,如果能在middle_per中找到ID,NAME,SFZ都一致的数据,就通过,放到一边不管,如果找不到全部一致的就挑出处理。
分不够在加。谢谢!!
Frewin的方法用NOT EXISTS检索不到数据,用ISNULL和不用ISNULL检索出的是一样的。Top
10 楼comszsoft(星星点灯)回复于 2004-12-02 21:17:46 得分 0
不是 isnull
是 is null
中间有个空格,okTop
11 楼denxiaom(蛤蟆老大)回复于 2004-12-02 23:14:40 得分 0
comszsoft(星星点灯) ???Top
12 楼denxiaom(蛤蟆老大)回复于 2004-12-02 23:21:22 得分 0
我发现问题了,好象是SFZ字段有重复值造成的。
select sfz from zginfo和select distinct sfz from zginfo检索出的结果数不等。
但怎么把重复值检索出来呢?Top
13 楼scorpiowell(年年岁岁花相似,岁岁年年人不同)回复于 2004-12-03 11:14:49 得分 40
查出sfz的相同数目:
select sfz,相同数目=count(sfz)
from zginfo aa
where (select count(sfz) from zginfo where sfz=aa.sfz group by sfz)>1
group by sfzTop
14 楼denxiaom(蛤蟆老大)回复于 2004-12-03 11:27:56 得分 0
多谢!
Top




