表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中的两条记录。

解决方案 »

  1.   

    where charindex(','+a.field1+',' , ','+b.field1+',') > 1
      

  2.   

    将表B按如下分解.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 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 行)
      

  3.   

    呵呵,老乌龟的对
    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           德国
      

  4.   

    一楼的方法简单:select a.*,b.* from a,b where charindex(','+a.field1+',',','+b.field1+',')>1
      

  5.   

    declare @t1 table(field1 varchar(10),field2 varchar(10))
    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
      

  6.   

    select a.* from A a cross join B b where charindex(a.field1,b.field1)>0