分解作者

--引自<潇洒老乌龟(爱新觉罗.毓华)>

请参考下例:

表: 
ID(自动增加的)     作者                             机构                                 刊名 
1                             A,B,C                       D,E,F                         XX 
2                             H,J,F,I                   Z,Y,W,V                     YY 
依次类推,作者跟机构可能是2个,或者是3个,没规律 
我想要实现的功能是: 
作者                         机构                                         刊名 
A                           D                                         XX 
B                           E                                         XX 
C                           F                                         XX 
H                           Z                                         YY 
J                           Y                                         YY 
F                           W                                         YY 
I                           V                                         YY 
数据量大概是20W   条左右,我该怎么实现呢? 
谢谢您!


CREATE TABLE tb(ID int,作者 varchar(10),机构 varchar(20),刊名 varchar(10))
INSERT into tb values(1,'A,B,C',  'D,E,F'  ,'XX') 
INSERT into tb values(2,'H,J,F,I','ZZ,YY,WWW,VVVV','YY') 
go
-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1) INTO tmp FROM syscolumns a, syscolumns b   

select t1.作者,t2.机构,t1.刊名 from
(
  select px=(select count(1) from 
  (
    SELECT A.ID, b.id bid,作者 = SUBSTRING(A.作者, B.ID, CHARINDEX(',', A.作者 + ',', B.ID) - B.ID),A.刊名 FROM tb A, tmp B WHERE SUBSTRING(',' + A.作者, B.id, 1) = ','
  ) m where id=t.id and bid <t.bid)+1 , * from 
  (
    SELECT A.ID, b.id bid,作者 = SUBSTRING(A.作者, B.ID, CHARINDEX(',', A.作者 + ',', B.ID) - B.ID),A.刊名 FROM tb A, tmp B WHERE SUBSTRING(',' + A.作者, B.id, 1) = ','
  ) t
) t1,
(
  select px=(select count(1) from 
  (
    SELECT A.ID, b.id bid,机构 = SUBSTRING(A.机构, B.ID, CHARINDEX(',', A.机构 + ',', B.ID) - B.ID) FROM tb A, tmp B WHERE SUBSTRING(',' + A.机构, B.id, 1) = ','
  ) m where id=t.id and bid <t.bid)+1 , * from 
  (
    SELECT A.ID, b.id bid,机构 = SUBSTRING(A.机构, B.ID, CHARINDEX(',', A.机构 + ',', B.ID) - B.ID) FROM tb A, tmp B WHERE SUBSTRING(',' + A.机构, B.id, 1) = ','
  ) t
) t2
where t1.id = t2.id and t1.px = t2.px
order by t1.id , t1.px

DROP TABLE tb,tmp

/*
作者         机构                   刊名         
---------- -------------------- ---------- 
A          D                    XX
B          E                    XX
C          F                    XX
H          ZZ                   YY
J          YY                   YY
F          WWW                  YY
I          VVVV                 YY

(所影响的行数为 7 行)
*/  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值