新足迹

 找回密码
 注册

精华好帖回顾

· 分享考奖学金一点经验 (2020-2-28) luckyabc · 澳大利亚的一些常见植物。 (2008-9-25) 华丽丽的那个谁
· 这就是我们的祖国 (2009-9-2) 八大山人 · 毛毛虫来啦~~~ (2007-10-16) 紫雪花
Advertisement
Advertisement
查看: 1747|回复: 16

请教一下各位SQL编程达人 [复制链接]

发表于 2013-6-12 12:13 |显示全部楼层
此文章由 hellograce 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hellograce 所有!转贴必须注明作者、出处和本声明,并保持内容完整
请教一下各位SQL编程达人,在SQL server2008中,如何把表A中的数据转换成表B?
Table A
ID        Suburb        Postcode
1        ABBOTSFORD,AIRPORT WEST,BRUNSWICK        3067,3042,3056
2        BOX HILL,MELBOURNE        3128,3000

Table B
ID        Suburb        Postcode
1        ABBOTSFORD        3067
1        AIRPORT WEST        3042
1        BRUNSWICK        3056
2        BOX HILL        3128
2        MELBOURNE        3000

(在表A中,suburb 和postcode的顺序是一一对应的)。
先谢谢各位不吝赐教了。分分感谢
Advertisement
Advertisement

发表于 2013-6-12 16:01 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你需要一个function来split text by ",",然后把结果存到临时表里处理:
CREATE FUNCTION [dbo].[fn_SplitString] (
        @Text nText,
        @delimiter char(1)
)
RETURNS @split_string table
        (id int IDENTITY(1,1) NOT NULL, part_string varchar(8000) NULL)
AS
BEGIN
          DECLARE @n_of_delimiters AS int
          DECLARE @i AS int  
        DECLARE @pstr As Varchar(8000)
        DECLARE @StartCharacter As BigInt
        DECLARE @EndCharacter As BigInt
        DECLARE @NumberIterations As BigInt
        DECLARE @CurrentIteration As BigInt
        DECLARE @DataLength As Decimal(19,2)
        DECLARE @CharacterLength As BigInt

        SET @CharacterLength         = 3996
        SET @DataLength         = DATALENGTH (@Text) / 2                        -- Divide the length by 2 as UNICODE uses 2 bytes to store 1 character of data
        SET @NumberIterations         = CEILING(@DataLength / @CharacterLength)
        SET @CurrentIteration        = 1
        SET @StartCharacter         = 1
        SET @EndCharacter        = @CharacterLength

        WHILE @CurrentIteration <= @NumberIterations
        BEGIN
                SET @pstr = SUBSTRING(@Text,@StartCharacter,@EndCharacter)
                SET @pstr = SUBSTRING(@pstr,1,@CharacterLength)

                -- Remove the ended comma
                If Right(@pstr,1) = @delimiter Set @pstr = substring(@pstr,1,Len(@pstr)-1)
       
                SET @n_of_delimiters=DATALENGTH(REPLACE(@pstr,@delimiter,@delimiter+'_')) - DATALENGTH(@pstr)
                 SET @i = 0
                  WHILE @i < @n_of_delimiters
                  BEGIN
                            SET @i = @i + 1
       
                            INSERT INTO @split_string
                              SELECT LEFT(@pstr,CHARINDEX(@delimiter,@pstr)-1)
       
                            SET @pstr=SUBSTRING(@pstr,CHARINDEX(@delimiter,@pstr)+1,8000)
                  END
       
                  INSERT INTO @split_string VALUES(@pstr)
       
                SET @CurrentIteration         = @CurrentIteration + 1
                SET @StartCharacter         = (@CharacterLength * (@CurrentIteration-1)) + 1
                SET @EndCharacter        = @CharacterLength * (@CurrentIteration)

        END

        RETURN
END

--SELECT * FROM [dbo].[fn_SplitString]('a,b,c,d',',')

评分

参与人数 1积分 +5 收起 理由
hellograce + 5 感谢分享

查看全部评分

发表于 2013-6-12 16:03 |显示全部楼层
此文章由 kawara 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kawara 所有!转贴必须注明作者、出处和本声明,并保持内容完整
从没见过表A那种表

发表于 2013-6-12 16:05 |显示全部楼层
此文章由 大飞熊 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 大飞熊 所有!转贴必须注明作者、出处和本声明,并保持内容完整
kawara 发表于 2013-6-12 15:03
从没见过表A那种表

有可能是Raw Data,导到数据库里面再转换。

评分

参与人数 1积分 +2 收起 理由
hellograce + 2 我很赞同

查看全部评分

走别人的路,让别人走投无路

发表于 2013-6-12 16:22 |显示全部楼层
此文章由 yzh1999 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yzh1999 所有!转贴必须注明作者、出处和本声明,并保持内容完整
gooderic1977 发表于 2013-6-12 15:01
你需要一个function来split text by ",",然后把结果存到临时表里处理:
CREATE FUNCTION [dbo].[fn_SplitS ...

顶一下2楼的正常做法。
还有一种2b做法:
把表a copy一份到表c,然后重复以下的事:
insert into b (
  select id, suburb, left(4, postcode) from c where length(postcode) >= 4
 );

update c set postcode = (把postcode左4以及逗号去掉) where length(postcode) >= 4

delete from c where postcode = ''

评分

参与人数 1积分 +5 收起 理由
hellograce + 5 感谢分享

查看全部评分

发表于 2013-6-12 17:04 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
小表直接导入ultredit, replace ',' by ctrl+enter
整理一下用列编辑直接写insert 就行啦 :-)

评分

参与人数 1积分 +3 收起 理由
hellograce + 3 就剩3分了,请笑纳

查看全部评分

Advertisement
Advertisement

发表于 2013-6-13 12:06 |显示全部楼层
此文章由 鱼羊鲜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 鱼羊鲜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
顶楼上

发表于 2013-6-14 13:36 |显示全部楼层
此文章由 hellograce 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hellograce 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大飞熊 发表于 2013-6-12 15:05
有可能是Raw Data,导到数据库里面再转换。

是的,表A是raw data, 我要把它转化成表B才方便处理

发表于 2013-6-14 13:59 |显示全部楼层
此文章由 hellograce 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hellograce 所有!转贴必须注明作者、出处和本声明,并保持内容完整
stevenbian 发表于 2013-6-12 16:04
小表直接导入ultredit, replace ',' by ctrl+enter
整理一下用列编辑直接写insert 就行啦 :-)
...

问题是其实表A不至两行,有几百行呢,所以要写程序来处理,不能全靠手工啊

发表于 2013-6-14 14:31 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
hellograce 发表于 2013-6-14 12:59
问题是其实表A不至两行,有几百行呢,所以要写程序来处理,不能全靠手工啊 ...

呵呵,没用过超级编辑器吧。
几千行都可以,列模式和替代很给力的。
不用你一条一条去编辑。很适合你这种一次性的应用。
签名不可外链

发表于 2013-6-14 15:50 |显示全部楼层
此文章由 鱼羊鲜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 鱼羊鲜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
hellograce 发表于 2013-6-14 12:59
问题是其实表A不至两行,有几百行呢,所以要写程序来处理,不能全靠手工啊 ...

几百行,我还以为几百万行呢
Advertisement
Advertisement

发表于 2013-6-14 16:33 |显示全部楼层
此文章由 hellograce 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hellograce 所有!转贴必须注明作者、出处和本声明,并保持内容完整
stevenbian 发表于 2013-6-14 13:31
呵呵,没用过超级编辑器吧。
几千行都可以,列模式和替代很给力的。
不用你一条一条去编辑。很适合你这种 ...

没用过ultreedit. Google了一下,好像下载不免费啊?

发表于 2013-6-14 16:34 |显示全部楼层
此文章由 hellograce 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hellograce 所有!转贴必须注明作者、出处和本声明,并保持内容完整
鱼羊鲜 发表于 2013-6-14 14:50
几百行,我还以为几百万行呢

呵呵,我这种菜鸟,先拿几百行练练手吧

发表于 2013-6-14 17:00 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
hellograce 发表于 2013-6-14 15:33
没用过ultreedit. Google了一下,好像下载不免费啊?

你先试用1个月呗。
好的话让老板买或者自己偷偷找注册码。
签名不可外链

发表于 2013-6-14 17:15 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
hellograce 发表于 2013-6-14 15:34
呵呵,我这种菜鸟,先拿几百行练练手吧

恩,用惯了就会觉得很方便。
根据你的例子
1.开一个UE窗口
2. select id||','||replace(suburb, ',', '''~'||id||',''') from a
3. 把结果复制进UE
4. 用ctrl+enter替代~
5.用列编辑前面加insert into b (id,suburb,postcode) values (
6.另开一个UE窗口
7. select postcode from b;
8. 把结果复制进UE
9. 用ctrl+enter替代,
10.用列编辑前面加个,‘后面加’);
11.用列复制到前面那个文本。
12.保存脚本去运行吧。

预计5分钟吧,比写个帖子都快
适合菜鸟,不用写程序 :-)


评分

参与人数 1积分 +5 收起 理由
hellograce + 5 感谢分享

查看全部评分

签名不可外链

发表于 2013-6-21 01:16 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
stevenbian 发表于 2013-6-12 16:04
小表直接导入ultredit, replace ',' by ctrl+enter
整理一下用列编辑直接写insert 就行啦 :-)
...

好方法
If you let people believe that you are weak, sooner or later you’re going to have to kill them.
Advertisement
Advertisement

发表于 2013-7-31 00:10 |显示全部楼层
此文章由 haidai 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 haidai 所有!转贴必须注明作者、出处和本声明,并保持内容完整

发表回复

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

本版积分规则

Advertisement
Advertisement
返回顶部