表A
rowidA  nameA
1        苹果
2        香蕉
3        肉丸
4        贡丸表B
rowidB nameB  rowidA
1       水果    1,2
2       食品    3,4要求查询结果
rowidB   nameB  nameA
1        水果     苹果
1        水果     香蕉
2        食品     肉丸
2        食品     贡丸
sql

解决方案 »

  1.   

    说明 在表B中 rowidA为多个 以逗号分开存储了
      

  2.   

    ----------------------------------------------------------------
    -- Author  :DBA_Huangzj(發糞塗牆)
    -- Date    :2013-01-14 20:46:05
    -- Version:
    --      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86) 
    -- Jun 17 2011 00:57:23 
    -- Copyright (c) Microsoft Corporation
    -- Enterprise Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
    --
    ----------------------------------------------------------------
    --> 测试数据:[A]
    if object_id('[A]') is not null drop table [A]
    go 
    create table [A]([rowidA] int,[nameA] varchar(4))
    insert [A]
    select 1,'苹果' union all
    select 2,'香蕉' union all
    select 3,'肉丸' union all
    select 4,'贡丸'
    --------------开始查询--------------------------
    --> 测试数据:[B]
    if object_id('[B]') is not null drop table [B]
    go 
    create table [B]([rowidB] int,[nameB] varchar(4),[rowidA] varchar(3))
    insert [B]
    select 1,'水果','1,2' union all
    select 2,'食品','3,4'
    --------------开始查询--------------------------SELECT  b.[rowidB] ,
            b.nameB ,
            a.nameA
    FROM    [A] a
            INNER JOIN ( SELECT [rowidB] ,
                                [nameB] ,
                                SUBSTRING([rowidA], number,
                                          CHARINDEX(',', [rowidA] + ',', number)
                                          - number) AS [rowidA]
                         FROM   [B] a ,
                                master..spt_values
                         WHERE  number >= 1
                                AND number <= LEN([rowidA])
                                AND type = 'p'
                                AND SUBSTRING(',' + [rowidA], number, 1) = ','
                       ) b ON a.rowidA = b.rowidA
    ----------------结果----------------------------/* 
    rowidB      nameB nameA
    ----------- ----- -----
    1           水果    苹果
    1           水果    香蕉
    2           食品    肉丸
    2           食品    贡丸(4 行受影响)*/
      

  3.   

    运行之后出现参数数据类型 int 对于 substring 函数的参数 1 无效
      

  4.   

    那就是你的数据有问题咯,比如有null值或者空值,我是根据你给出的数据执行的。检查一下你那里是否有这两类值,并且数据量会不会很大,这个查询一般到2000多行就不能这样用了
      

  5.   

    select中可以用case语句来实现啊啊。。
      

  6.   

    那我指定查询表B中的rowidB为1的 这样就不会出现空值了 怎么加入rowidB=1这个条件
      

  7.   

    ---------------------------------------------------------------- 
    -- Author  :DBA_Huangzj(發糞塗牆) 
    -- Date    :2013-01-14 20:46:05 
    -- Version: 
    --      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86)  
    --    Jun 17 2011 00:57:23  
    --    Copyright (c) Microsoft Corporation 
    --    Enterprise Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1) 
    -- 
    ---------------------------------------------------------------- 
    --> 测试数据:[A] 
    if object_id('[A]') is not null drop table [A] 
    go  
    create table [A]([rowidA] int,[nameA] varchar(4)) 
    insert [A] 
    select 1,'苹果' union all
    select 2,'香蕉' union all
    select 3,'肉丸' union all
    select 4,'贡丸'
    --------------开始查询-------------------------- 
    --> 测试数据:[B] 
    if object_id('[B]') is not null drop table [B] 
    go  
    create table [B]([rowidB] int,[nameB] varchar(4),[rowidA] varchar(3)) 
    insert [B] 
    select 1,'水果','1,2' union all
    select 2,'食品','3,4'
    --------------开始查询-------------------------- 
      
    SELECT  b.[rowidB] , 
            b.nameB , 
            a.nameA 
    FROM    [A] a 
            INNER JOIN ( SELECT [rowidB] , 
                                [nameB] , 
                                SUBSTRING([rowidA], number, 
                                          CHARINDEX(',', [rowidA] + ',', number) 
                                          - number) AS [rowidA] 
                         FROM   (SELECT * FROM [B] WHERE rowidB=1) a , 
                                master..spt_values 
                         WHERE  number >= 1 
                                AND number <= LEN([rowidA]) 
                                AND type = 'p'
                                AND SUBSTRING(',' + [rowidA], number, 1) = ','
                       ) b ON a.rowidA = b.rowidA 
    ----------------结果---------------------------- 
      
    /*  
    rowidB      nameB nameA
    ----------- ----- -----
    1           水果    苹果
    1           水果    香蕉(2 行受影响)
      
    */
      

  8.   

    不好意思啊 我那个rowidA有的点乱 不知道是表A中的还是表B中的了 如果是表B中的 那么把sql语句里面的rowidA改成rowidAB可以吗