表A(海量数据库)结构如下:
field1 field2 ....
a1 1
a2 2
a3 3
....
an n表B结构如下:
field1 field2 ....
a1,a2 b1
a4,a5,a8 b2
....
am bm请问高手,如何根据表B中字段field1中的值(以逗号分隔)找出海量表A中匹配的记录?如表B中a1,a2匹配表A中的两条记录。
field1 field2 ....
a1 1
a2 2
a3 3
....
an n表B结构如下:
field1 field2 ....
a1,a2 b1
a4,a5,a8 b2
....
am bm请问高手,如何根据表B中字段field1中的值(以逗号分隔)找出海量表A中匹配的记录?如表B中a1,a2匹配表A中的两条记录。
INSERT A
SELECT 1,'中国;日本;韩国' UNION ALL
SELECT 2,'美国;意大利;法国' UNION ALL
SELECT 3,'德国'
SELECT * FROM A-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b
SELECT
A.ID,
COUNTRY = SUBSTRING(A.COUNTRY, B.ID, CHARINDEX(';', A.COUNTRY + ';', B.ID) - B.ID)
FROM A, # B
WHERE SUBSTRING(';' + a.COUNTRY, B.id, 1) = ';'
ORDER BY 1,2
GODROP TABLE A,#id country
----------- ----------------
1 中国;日本;韩国
2 美国;意大利;法国
3 德国(所影响的行数为 3 行)ID COUNTRY
----------- ---------
1 韩国
1 日本
1 中国
2 法国
2 美国
2 意大利
3 德国(所影响的行数为 7 行)
CREATE TABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT 1,'中国;日本;韩国' UNION ALL
SELECT 2,'美国;意大利;法国' UNION ALL
SELECT 3,'德国'
SELECT * FROM A-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b
SELECT
A.ID,
COUNTRY = SUBSTRING(A.COUNTRY, B.ID, CHARINDEX(';', A.COUNTRY + ';', B.ID) - B.ID)
FROM A, # B
WHERE CHARINDEX(';',';'+a.COUNTRY,B.ID) = B.ID GODROP TABLE A,#
------------结果
ID COUNTRY
----------- ----------------------------------------------------------------------------------------------------
1 中国
1 日本
1 韩国
2 美国
2 意大利
2 法国
3 德国
insert @t1 select 'a1','1'
union all select 'a2','2'
union all select 'a3','3'declare @t2 table(field1 varchar(10),field2 varchar(10))
insert @t2 select 'a1,a2','b1'
union all select 'a4,a5,a8','b2'if object_id('tempdb..#t1')>0
drop table #t1select top 50 id=identity(int,1,1) into #t1 from syscolumnsif object_id('tempdb..#t2')>0
drop table #t2
select field1=substring(a.field1,b.id,charindex(',',a.field1+',',b.id)-b.id)
into #t2
from @t2 a,#t1 b
where b.id<len(a.field1+'a')
and charindex(',',','+a.field1,b.id)=b.idselect a.field1,b.field2
from #t2 a,@t1 b
where a.field1=b.field1