首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • update [已结贴,结贴人:wolflove23]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 16:41:00 楼主
    表a
    出货日期    实际编号
    2008-1-14    1
    2008-1-14    2
    2008-1-15    3
    表b
    出货日期    备注
    2008-1-14  null
    2008-1-15  null
    我现在想2个表联合查询 select * from a join b on a.出货日期=b.出货日期
    怎样才能更新b表的备注呢?变成
    出货日期    备注
    2008-1-14  1,2
    2008-1-15  3
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 16:46:021楼 得分:0
    SQL code
    update 表b set 表b.备注=t.备注 from 表b inner join ( SELECT 出货日期, STUFF((SELECT ',' + cast(实际编号 as varchar) AS [text()] --此处STUFF函数的目的是除去字符串首部的逗号 FROM 表a AS G2 WHERE G2.出货日期 = G1.出货日期 ORDER BY 实际编号 FOR XML PATH('')), 1, 1, '') AS 备注 FROM 表a AS G1 GROUP BY 出货日期) as t on 表b.出货日期=t.出货日期
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 16:46:222楼 得分:0
    SQL code
    --各种字符串分函数 --3.3.1 使用游标法进行字符串合并处理的示例。 --处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3 --合并处理 --定义结果集表变量 DECLARE @t TABLE(col1 varchar(10),col2 varchar(100)) --定义游标并进行合并处理 DECLARE tb CURSOR LOCAL FOR SELECT col1,col2 FROM tb ORDER BY col1,col2 DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100) OPEN tb FETCH tb INTO @col1,@col2 SELECT @col1_old=@col1,@s='' WHILE @@FETCH_STATUS=0 BEGIN IF @col1=@col1_old SELECT @s=@s+','+CAST(@col2 as varchar) ELSE BEGIN INSERT @t VALUES(@col1_old,STUFF(@s,1,1,'')) SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1 END FETCH tb INTO @col1,@col2 END INSERT @t VALUES(@col1_old,STUFF(@s,1,1,'')) CLOSE tb DEALLOCATE tb --显示结果并删除测试数据 SELECT * FROM @t DROP TABLE tb /*--结果 col1 col2 ---------- ----------- a 1,2 b 1,2,3 --*/ GO /*==============================================*/ --3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例 --处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3 GO --合并处理函数 CREATE FUNCTION dbo.f_str(@col1 varchar(10)) RETURNS varchar(100) AS BEGIN DECLARE @re varchar(100) SET @re='' SELECT @re=@re+','+CAST(col2 as varchar) FROM tb WHERE col1=@col1 RETURN(STUFF(@re,1,1,'')) END GO --调用函数 SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1 --删除测试 DROP TABLE tb DROP FUNCTION f_str /*--结果 col1 col2 ---------- ----------- a 1,2 b 1,2,3 --*/ GO /*==============================================*/ --3.3.3 使用临时表实现字符串合并处理的示例 --处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3 --合并处理 SELECT col1,col2=CAST(col2 as varchar(100)) INTO #t FROM tb ORDER BY col1,col2 DECLARE @col1 varchar(10),@col2 varchar(100) UPDATE #t SET @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END, @col1=col1, col2=@col2 SELECT * FROM #t /*--更新处理后的临时表 col1 col2 ---------- ------------- a 1 a 1,2 b 1 b 1,2 b 1,2,3 --*/ --得到最终结果 SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1 /*--结果 col1 col2 ---------- ----------- a 1,2 b 1,2,3 --*/ --删除测试 DROP TABLE tb,#t GO /*==============================================*/ --3.3.4.1 每组 <=2 条记录的合并 --处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'c',3 --合并处理 SELECT col1, col2=CAST(MIN(col2) as varchar) +CASE WHEN COUNT(*)=1 THEN '' ELSE ','+CAST(MAX(col2) as varchar) END FROM tb GROUP BY col1 DROP TABLE tb /*--结果 col1 col2 ---------- ---------- a 1,2 b 1,2 c 3 --*/ --3.3.4.2 每组 <=3 条记录的合并 --处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3 UNION ALL SELECT 'c',3 --合并处理 SELECT col1, col2=CAST(MIN(col2) as varchar) +CASE WHEN COUNT(*)=3 THEN ',' +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar) ELSE '' END +CASE WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar) ELSE '' END FROM tb a GROUP BY col1 DROP TABLE tb /*--结果 col1 col2 ---------- ------------ a 1,2 b 1,2,3 c 3 --*/ GO
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 16:49:293楼 得分:0
    SQL code
    如果是2000,注意每个日期的编号数目,这里最大为4个 update 表b set 表b.备注=t.备注 from 表b inner join ( SELECT 出货日期, MAX(CASE WHEN rn = 1 THEN cast(实际编号 as varchar) ELSE '' END) + MAX(CASE WHEN rn = 2 THEN ',' + cast(实际编号 as varchar) ELSE '' END) + MAX(CASE WHEN rn = 3 THEN ',' + cast(实际编号 as varchar) ELSE '' END) + MAX(CASE WHEN rn = 4 THEN ',' + cast(实际编号 as varchar) ELSE '' END) AS 备注 FROM (SELECT a,实际编号, (SELECT COUNT(*) FROM 表a AS B WHERE B.出货日期 = A.出货日期 AND B.实际编号 <= A.实际编号) AS rn FROM 表a AS A) AS D GROUP BY 出货日期) as t on 表b.出货日期=t.出货日期
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 16:50:374楼 得分:0
    2楼用我发的帖子,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 16:52:145楼 得分:0
    看错了,是类似我以前发的贴
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 16:52:416楼 得分:0
    SQL code
    create table ta(出货日期 datetime,实际编号 varchar(10)) insert into ta values('2008-1-14','1') insert into ta values('2008-1-14','2') insert into ta values('2008-1-15','3') create table tb(出货日期 datetime,备注 varchar(8000)) insert into tb values('2008-1-14',null) insert into tb values('2008-1-15',null) create FUNCTION dbo.f_str(@col1 varchar(10)) RETURNS varchar(100) AS BEGIN DECLARE @re varchar(100) SET @re='' SELECT @re=@re+','+CAST(实际编号 as varchar) FROM ta WHERE 出货日期=@col1 RETURN(STUFF(@re,1,1,'')) END update tb set 备注=b.实际编号 from tb a,(select 出货日期,dbo.f_str(出货日期) as 实际编号 from ta group by 出货日期)b where a.出货日期=b.出货日期 select * from tb
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 16:56:057楼 得分:0
    我晕,你知道那帖是谁的吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 16:56:258楼 得分:0
    SQL code
    --环境 create table a ( 出货日期 datetime, 实际编号 int ) create table b ( 出货日期 datetime, 备注 varchar(20) ) insert into a select '2008-1-14', 1 insert into a select '2008-1-14', 2 insert into a select '2008-1-15', 3 insert into b select '2008-1-14', null insert into b select '2008-1-15', null --建立辅助函数 create function f_conn(@出货日期 datetime) returns varchar(20) as begin declare @str varchar(20) set @str = '' select @str = @str + ',' + cast(实际编号 as varchar) from a where 出货日期 = @出货日期 select @str = stuff(@str,1,1,'') return (@str) end --更新 update b set 备注 = beizhu from (select distinct 出货日期,dbo.f_conn(出货日期) as beizhu from a)a where a.出货日期 = b.出货日期 --查询结果 select * from b /* 出货日期 备注 ----------------------- -------------------- 2008-01-14 00:00:00.000 1,2 2008-01-15 00:00:00.000 3 (2 row(s) affected) */ --删除环境 drop table a drop table b drop function f_conn
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 17:44:149楼 得分:5
    if object_id('表a') is not null
      drop table 表a
    if object_id('表b') is not null
      drop table 表b
    if object_id('f_getstring') is not null
      drop function f_getstring
    go
    create table 表a(出货日期 datetime,实际编号 varchar(10))
    insert into 表a
    select '2008-1-14','1' union all
    select '2008-1-14','2' union all
    select '2008-1-15','3'
    create table 表b(出货日期 datetime,备注 varchar(10))
    insert into 表b
    select '2008-1-14',null union all
    select '2008-1-15',null
    go
    create function f_getstring(@Out_dt datetime)
    returns varchar(8000)
    as
    begin
      declare cur cursor for select cast(实际编号 as varchar(10)) from 表a where 出货日期=@Out_dt
      open cur
      declare @s varchar(8000),@now varchar(10)
      fetch next from cur into @now
      while(@@fetch_status=0)
          begin
            set @s=isnull(@s,'')+@now+','
            fetch next from cur into @now
          end
      close cur
      deallocate cur
      return substring(@s,1,len(@s)-1)
    end

    go
    --如果只是查询出想要的结果
    select 出货日期,dbo.f_getstring(出货日期)  as 备注 from 表b
    --真正的更新表b
    update 表b set 备注=dbo.f_getstring(出货日期)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • conan304
    • 等级:
    发表于:2008-02-19 17:56:2410楼 得分:5
    4楼难道是老大的马甲??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 17:58:3411楼 得分:5
    我不是老大的马甲
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-19 18:09:0812楼 得分:5
    呵呵
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved