对了,我用SQL SERVER.感觉要用表子查询。
解决方案 »
- 请教两张表排序问题?
- 在线等 解决后马上散分!谢谢大家
- 请问系统表中那张表是存放用户表的?
- 使用 EXISTS 和NOT EXISTS 效率一样吗?
- @dbname.dbo.tablename 出错,库名如何引用变量得到
- 请问如何写这样的WHERE语句
- 请 marco08(天道酬勤) 进来,,多谢帮忙,给一小分(50),UP有分
- 一个简单的sql语句。在线等
- sqlserver 怎么有重复行?
- 各位有这们的问题吗??
- :这个内嵌SQL语句 exec sql database sptdb;我看不懂,查阅有关SQL书籍亦无收获,各位能否帮忙解释一下? 用的是INFORMIX .
- 急!!!怎样实现在触发器中更新另一个数据库中的数据(sql server)
(select s_yjdm,s_ckdm,s_ph
from kcqk
group by s_yjdm,s_ckdm,s_ph having count(*) > 1) as bwhere a.s_yjdm=b.s_yjdm and a.s_ckdm=b.s_ckdm and a.f_rksl=b.f_rksl
(select s_yjdm,s_ckdm,s_ph,count(*)
from kcqk
group by s_yjdm,s_ckdm,s_ph having count(*) > 1) b
where a.s_yjdm=b.s_yjdm
and a.s_ckdm=b.s_ckdm
and a.s_ph=b.s_ph
select a.s_yjdm,a.s_ckdm,a.s_ph,a.i_rksl,a.i_sjsl,a.m_rkdj from kcqk a,
(select s_yjdm,s_ckdm,s_ph
from kcqk
group by s_yjdm,s_ckdm,s_ph having count(*) > 1) b
where a.s_yjdm=b.s_yjdm
and a.s_ckdm=b.s_ckdm
and a.s_ph=b.s_ph
to hailong525(风云):
1、好象是b中不能有聚集函数吧:有count(*)时返回错误:No column was specified for column 4 of 'b'.
2、使用*会列出两个表中所有数据。
谢谢!明天结贴.
2.即使你将s_yjdm,s_ckdm,s_ph相同的项全部给列出来,也没有太大意义,因为你还是要聚组以后才能把数据导回去。
3.如果s_yjdm,s_ckdm,s_ph相同的记录中,其他字段的值如果不一样,你怎么合并?
4.按照你建表的思路考虑,好像是同一仓库同一批次的元件可以有相同元件代码的两条记录,那有为什么要查看s_yjdm,s_ckdm,s_ph三个字段呢?
不过我是在导数据,他以前的表的结构是:
id 种子列
s_yjdm,元件代码
s_ckdm,仓库代码
s_ph, 批号
批号为六位的日期,例如:'010628',所以同一天一个仓库的同一种元件多次入库在我的表中就成了重复数据,而我的批号是这样设置的:‘01062801’,后两位为序列号。所以我要求得到的是每一条的明细,然后将'010628'类型转化为‘0106280X’类型。我现在做的是将如上b中count(*) = 1的update,count(*)>1的用手工改,幸亏只有几十条数据。谁能不能够,将多条'010628'的重复数据加上序列号转化为‘0106280X’类型。虽然这一次没用到,但大家探讨探讨。
提高帖子的分数先!
当然有方法阿!
第一部是建立一个和这个表一样的表但是要加上一个字段iid identity
然后把你的数据导入到这个表kcqk1
第二部生名cursor找到所有
重复的纪录
declare kk cursor for
select s_yjdm,s_ckdm,s_ph,count(*)
from kcqk1
group by s_yjdm,s_ckdm,s_ph having count(*) > 1 open kkkfetch next from kk
into @k1,@k2,@k3,@k4while @@FETCH_STATUS = 0
begin
--求出来这个s_yjdm,元件代码s_ckdm,仓库代码s_ph的最大的iid和最小的iid
select @k5=min(iid),@k6=max(iid) from kcqk1 where s_yjdm=@k1
and s_ckdm=@k2 and s_ph=@k3
select @k=0
while @k<@k4
begin
update kcqk1
set kcqk.s_ph=kcqk.s_ph+@k+1
where s_yjdm=@k1 and s_ckdm=@k2 and s_ph=@k3 and iid=@k5+@k1
select @k=@k+1
end
fetch next from kk
into @k1,@k2,@k3,@k4
end
close kk
DEALLOCATE kk
最后
delete from kcqk
还要把数据导入
insert into kcqk
select ... from kcqk1
drop table kcqk1
不知道明白了没有
select field1 from tablename x where rowid <(select max(rowid) from tablename where field1=x.field1);
看不明白update中的iid=@k5+@k1是什么意思,好象循环不能定位s_yjdm,s_ckdm,s_ph相同的iid,觉得还是用嵌套游标。第一个游标如上,第二个游标列s_yjdm,s_ckdm,s_ph相同的所有列。
select l.s_yjdm,
l.s_ckdm,
r.s_ph,
r.s_yjdm,
r.f_rksl,
r.f_xcsl,
r.m_rkdj
from kcqk l
join kcqk r
on l.s_yjdm = r.s_yjdm
l.s_ckdm = r.s_ckdm
group by l.s_yjdm,
l.s_ckdm,
l.s_ph,
l.s_yjdm,
l.f_rksl,
l.f_xcsl,
l.m_rkdj
r.s_yjdm,
r.s_ckdm
having count(r.s_yjdm)>1
例如下表:
iid s_yjdm s_ckdm s_ph ...
1 001 001 010628
7 001 001 010628
8 001 001 010628
12 001 001 010628
我觉得用循环并不能将iid = 1的列的s_ph更新为0106281,iid = 7的列的s_ph更新为0106282...循环很难区分iid=1和iid=7的上述行。所以我觉得还是应该用嵌套游标。
to ccat(阿猫):
谢谢关注!第一个问题已经解决了,看看第二个问题吧。
你想也是啊!我设置了一个identity字段!不对其进行删除!一次性插入!你说会不连续吗?
我真是不明白!你的数据会怎么出现!如果你的数据真的出现了(我说的使用我的方法,我真的
会佩服你的)
不信你就试验一下!看看这个可能性有没有!
任何两个我说的表都可以!好好想了在回答!ok!
谢谢了