我有一张大表,里面很多字段,需要将这张大表的数据拆分到几张小表,每张小表只是取大表的某几列,而大表的数据中一部分数据是需要拆分后再放入小表的,和下面这个例子类似
(大表和小表的对应关系,列和列,以及大表的哪个列需要拆分都是放在表里面的),由于我的对应关系和列都不是固定的,所以求那种对拆分列不限制死的sql找到一段sql如下(http://bbs.csdn.net/topics/310219852),但并不能解决我的问题:---------------------------------
--  Author: htl258(Tony)
--  Date  : 2009-08-13 09:53:53
---------------------------------
--> 生成测试数据表:table1If not object_id('[table1]') is null
Drop table [table1]
Go
Create table [table1]([a1] int,[a2] nvarchar(5),[a3] nvarchar(5))
Insert table1
Select 1,'a','一' union all
Select 2,'a,b','一,二' union all
Select 3,'a,b,c','一,二,三'
Go
--Select * from table1-->SQL查询如下:
select b.a1, substring(b.a2+',',number,charindex(',',b.a2+',',number+1)-number) a2,
    substring(b.a3+',',number,charindex(',',b.a3+',',number+1)-number) a3
from master..spt_values a,[table1] b
where a.type='p' and substring(','+b.a2,number,1)=','/*
a1          a2     a3
----------- ------ ------
1           a      一
2           a      一
2           b      二
3           a      一
3           b      二
3           c      三(6 行受影响)*/但如果数据是如下的话,拆分就有问题了If not object_id('[table1]') is null
Drop table [table1]
Go
Create table [table1]([a1] int,[a2] nvarchar(5),[a3] nvarchar(5))
Insert table1
Select 1,'a','一' union all
Select 2,'a,b','一,二' union all
Select 3,'a,bc,cef','一,二,三' ----以此行为例
Go
--Select * from table1
请教,如果这种数据要拆分的话改怎么办呢?一句sql真的搞不定吗?
如果一句sql搞不定,大家有没什么好的思路?还有人用xml的方式(详见http://bbs.csdn.net/topics/310219852),但看不太懂,自己也不会改,如果这种方式也可以解决我的问题的话麻烦大家给写个吧,拆两个字段的我看到了,但拆三个字段的话如何写呢?麻烦给写下三个,我自己类推下多个字段的拆分,呵呵,先谢了~~~ps.我一共就只有25分,比较穷,大家别嫌弃哈~~~~SQL数据拆分

解决方案 »

  1.   

    基本是一样的东西啊,你只要把number+1这个数值替换成下一个逗号的位置就行。
      

  2.   

    帮楼主顶,另外也求大侠帮我看看http://bbs.csdn.net/topics/390481209
      

  3.   


    不是的,可能我的例子正好写成这样了,其实各个逗号间字符串的长度都是不定的我目前用拼sql的方法实现了,核心思想是要循环每个需要拆分的字段,用sql拼接的方式实现:
    例如表Create table [table1]([a1] int,[a2] nvarchar(5),[a3] nvarchar(5)) 
    Insert table1 
    Select 1,'a','一' 
    union all
    Select 2,'a,b','一,二' 
    union all
    Select 3,'a,bc,cef','一,二,三'
     
    需要拆分的是a2和a3字段,那sql大致是如下形式 select b.a1,aa.a2,bb.a3
    (select b.a1,id, substring(b.a2+',',number,charindex(',',b.a2+',',number+1)-number) a2,     substring(b.a3+',',number,charindex(',',b.a3+',',number+1)-number) a3 from master..spt_values a,[table1] b where a.type='p' and substring(','+b.a2,number,1)=',')aa
    inner join
    (select id,substring(b.a3+',',number,charindex(',',b.a3+',',number+1)-number) a3 from master..spt_values a,[table1] b where a.type='p' and substring(','+b.a3,number,1)=','
    ) bb on aa.id=bb.id这里需要特别说明的是id,这个是从哪儿来的呢?其实这个是一个表示数据所在行且为自增的字段,id取值从1开始,生成自增字段的方法sql里没有,自己网上找吧,很多虽然暂时问题解决了,但我始终觉得一个sql应该可以搞定的,所以继续等待高人解答