如何用SQL语句实现如下目的?

[复制链接]
查看11 | 回复9 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
数据库:MS SQL 2000:
drop table mytest
go
create table mytest
(
snint,
codevarchar(8),
ins_novarchar(6),
)
go
insert mytest values(1, '01', 'A')
insert mytest values(1, '01', 'B')
insert mytest values(2, '02', 'A')
insert mytest values(2, '02', 'D')
insert mytest values(3, '01', 'A')
insert mytest values(3, '01', 'B')
insert mytest values(4, '03', 'A')
insert mytest values(4, '03', 'B')
insert mytest values(4, '03', 'C')
insert mytest values(5, '03', 'B')
insert mytest values(5, '03', 'C')
insert mytest values(6, '02', 'A')
insert mytest values(6, '02', 'C')
insert mytest values(6, '02', 'D')
go
select * from mytest
go
sn codeins_no
-----------------
101A
101B
202A
202D
403A
403B
403C
503B
503C
602A
602C
602D
能否用一个查询语句得到?先谢了
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
没看明白,说明一下。
只是看到sn=3的纪录没有了。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
字段SN是用来分组的。如果不同SN下的记录完全一样(除了SN本身),包括记录条数、字段内容,则我希望只保留一个分组,例子中分组1和3满足这种情况,所以把分组3剔除掉。
但分组2和分组6由于记录条数不等,所以仍然保留。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
那1﹐3相同﹐憑什么不刪除1而刪除3﹖
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
最初由 xzh2000 发布
[B]那1﹐3相同﹐憑什么不刪除1而刪除3﹖ [/B]

反正只能保留一个,删除1也可以。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
偶又来啦, 先考虑一下思路吧

一组一组把数据分好, 然后取第一组和其余的比较, 如有相同的则删掉该组, 直到最后, 不过这里有顺序关系, 所以要用SP
再进一步, 任取一组数据和其他数据比较, 如有相同则保留编号小的一组, 这样就没有了顺序执行的问题, 可以用SQL来完成了, 不过SQL SERVER不支持MINUS组的比较相当繁琐, 郁闷


先写用MINUS的情形, 你自己用NOT EXISTS 转换吧


select * from mytest where
sn = (
select distinct sn from sn t1-->这里开始分组比较
where not exists(
select distinct sn from mytest t2 -->取另一组
where t2.sn相同时取最小编号
and
exists(
-->组比较
select code, ins_no from mytest t3
where sn=t1.sn
minus
select code, ins_no from mytest t4
where sn=t2.sn)))
由于没有管理组编号的表, 上面那段SQL文的效率是很糟糕地, 还是考虑用SP做吧
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
select max(a.sn)as sn,a.code,a.ins_no
from mytest a,(select sn,count(1) as num from mytest b group by sn)b
where a.sn=b.sn
group by a.code,a.ins_no,b.num
order by max(a.sn)
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
我喜欢你这样清晰的表达需求,这样很有诚意。
上面的max可以换成min,就是你说的“反正只能保留一个,删除1也可以”
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
最初由 lodge 发布
[B]偶又来啦, 先考虑一下思路吧

[/B]

发现lodge兄的理论很扎实

,我也许做的出来,但有时会不知道怎么讲明白


楼主有兴趣,还可以看看这一贴:
http://www.itpub.net/showthread.php?s=&threadid=181426
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
最初由 magicangel 发布
[B]select max(a.sn)as sn,a.code,a.ins_no
from mytest a,(select sn,count(1) as num from mytest b group by sn)b
where a.sn=b.sn
group by a.code,a.ins_no,b.num
order by max(a.sn) [/B]

我知道用SP肯定是可以搞定的,但太麻烦了。所以看能不能通过一个简单的查询语句来实现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行