有两个表,表1中的字段有编码,接收人, 表2中的字段有编码,姓名
其中:1)表1中的接收人是有多个表2中的编码组成的,例如:0001,0002,0003
2)我要得到的是真正的接收人应该是有表2的姓名组成的,例如:小明,小丽,小刚
3)两个表的连接条件是:表1.接收人=表2.编码下面是表:
表1: 编码   接收人
       1     0001,0003
       2     0001,0002
       3     0001,0002,0003
表2: 编码   姓名 
      0001   小明
      0002   小丽
      0003   小刚希望大家帮助呀!俺在线等!。。

解决方案 »

  1.   

    select * from 表1 INNER join 表2 ON (right(表1.接收人,4) = 表2.编码)
      

  2.   

    SELECT FROM 表1 LEFT JOIN 表2 ON 表1.接收人 = 表2.编号;
      

  3.   

    oydu(海阔天空)  我照着你说的查出来数据都是空的
      

  4.   

    sibyle(先知) 你没有看明白我真正要查的结果!!!
      

  5.   

    1、SELECT FROM 表1 LEFT JOIN 表2 ON 表1.接收人 = 表2.编号; 左连 取表1所有记录
    2、SELECT FROM 表1 RIGHT JOIN 表2 ON 表1.接收人 = 表2.编号;右链取表2中所有记录
    3、SELECT FROM 表1 INNER JOIN 表2 ON 表1.接收人 = 表2.编号;取所有记录
      

  6.   

    我现在不想修改表的结构!谢谢了!就想用SQL 语句查询!能办到吗??
      

  7.   

    sibyle(先知) 
    你还是没看明白我说的呀!
      

  8.   

    sibyle(先知)
    我的表是这样的:
    表1: 编码   接收人
           1     0001,0003
           2     0001,0002
           3     0001,0002,0003
    表2: 编码   姓名 
          0001   小明
          0002   小丽
          0003   小刚
      

  9.   

    简单
    select 表1.编码,表2.姓名 from 表1 left join  表2 on 表1.接收人=表2.编码
      

  10.   

    guoxiaopeng1982(从小就很狂) 
    晕!你好好看看我说的!!!
      

  11.   

    用存储过程来实现,要使用游标的DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR 
    FOR select_statement 
    [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]Transact-SQL 扩展语法
    DECLARE cursor_name CURSOR 
    [ LOCAL | GLOBAL ] 
    [ FORWARD_ONLY | SCROLL ] 
    [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
    [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
    [ TYPE_WARNING ] 
    FOR select_statement 
    [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
      

  12.   

    create function uf_splitstring
    (
    @str varchar(8000)--要分拆的字符串
    ,@spli varchar(10)--字符串分隔符
    )
    returns @retab table(istr varchar(8000))
    as
    begin
    declare @i int
    declare @splen int
    select @splen=len(@spli),@i=charindex(@spli,@str)
    while @i > 0
    begin
    insert into @retab 
    values(left(@str,@i-1))
    select @str=substring(@str,@i+@splen,8000)
    select @i=charindex(@spli,@str)
    end
    if @str<>'' insert into @retab values(@str)
    return
    endselect * from uf_splitstring('1,2,3,4,5,6,7,8',',')
    =================================
    这个过程也许对你有用
      

  13.   

    select 表1.接收人,表1.编码,((select 姓名 from 表2 where  left(表1.接收人,5)=表2.编码)+cast( case  when substring(表1.接收人,6,1)=',' 
    then ','+(select 姓名 from 表2 where  substring(表1.接收人,7,5)=表2.编码) else '' end  + case when substring(表1.接收人,12,1)=',' 
    then ','+(select 姓名 from 表2 where  substring(表1.接收人,13,5)=表2.编码) else '' end  as nvarchar(16)) ) as 接收人 from 表2 INNER join 表1 ON (right(表1.接收人,5) = 表2.编码)
    这个是你要的结果吧晕接收人                    编码       接收人
    00001,00003          1 小明,小刚
    00001,00002          2 小明,小丽
    00001,00002,00003 3 小明,小丽,小刚
      

  14.   

    oydu(海阔天空)  chinank(中国南开)
    谢谢两位!等下午我试试!现在要去吃饭了!呵呵!
    解决了一定马上给大家分!
      

  15.   

    最后说一话
    不建议你使用我写的那个方法能实现但一条SQL语句目前我也只会这么写了!
    总之我测试过能实现你现在的要求的那个结果!
      

  16.   

    create table #t(编码 char(10),接收人 varchar(100))
    INSERT #t SELECT 1,'0001,0003'
    UNION ALL SELECT 2,'0001,0002'
    UNION ALL SELECT 3,'0001,0002,0003'create table #t2(编码 char(10),姓名 varchar(100))
    INSERT #t2 SELECT '0001','小明'
    UNION ALL SELECT  '0002','小丽'
    UNION ALL SELECT  '0003','小刚'select * from #t
    select * from #t2declare @sql varchar(8000)
    select top 1 @sql = 'replace(接收人, ''' + rtrim(编码) + ''', ''' + 姓名 + ''')' from #t2select @sql = 'replace(' + @sql + ', ''' + rtrim(编码) + ''', ''' + 姓名 + ''')' from #t2 where 编码 not in (select top 1 编码 from #t2)select @sql = 'select 编码, ' + @sql + ' 接收人 from #t'
    print @sqlexec(@sql)
    给分
      

  17.   

    JF的主子......................JF的主子......................JF的主子......................JF的主子......................JF的主子......................JF的主子......................
      

  18.   

    select 表1名.编码,表2名.姓名 from 表1名,表2名 where 表1名.接收人=表2名.编码
      

  19.   

    create table 表1
    (
        编码 int,
        接受人 char(4)
    )insert into 表1 values(1,'0001')
    insert into 表1 values(1,'0003')
    insert into 表1 values(2,'0001')
    insert into 表1 values(2,'0002')
    insert into 表1 values(3,'0001')
    insert into 表1 values(3,'0002')
    insert into 表1 values(3,'0003')create table 表2
    (
        编码 char(4),
        姓名 varchar(20)
    )insert into 表2 values('0001','小明')
    insert into 表2 values('0002','小丽')
    insert into 表2 values('0003','小刚')以下一句足以
    select a.编码,b.姓名 from 表1 a inner join 表2 b
    on a.接受人 = b.编码
      

  20.   

    qiuyun8m() ( ) 信誉:100    Blog   加为好友  2007-6-6 11:46:30  得分: 0  
     
     
       
    create table #t(编码 char(10),接收人 varchar(100))
    INSERT #t SELECT 1,'0001,0003'
    UNION ALL SELECT 2,'0001,0002'
    UNION ALL SELECT 3,'0001,0002,0003'create table #t2(编码 char(10),姓名 varchar(100))
    INSERT #t2 SELECT '0001','小明'
    UNION ALL SELECT  '0002','小丽'
    UNION ALL SELECT  '0003','小刚'select * from #t
    select * from #t2declare @sql varchar(8000)
    select top 1 @sql = 'replace(接收人, ''' + rtrim(编码) + ''', ''' + 姓名 + ''')' from #t2select @sql = 'replace(' + @sql + ', ''' + rtrim(编码) + ''', ''' + 姓名 + ''')' from #t2 where 编码 not in (select top 1 编码 from #t2)select @sql = 'select 编码, ' + @sql + ' 接收人 from #t'
    print @sqlexec(@sql)
    ------------------------------------------------
    这个写法很别致哦。不错,  
     
      

  21.   

    oydu(海阔天空)  chinank(中国南开)
    的确可以
      

  22.   

    if object_id('tempdb..#t') is not null 
    drop table #t
    if object_id('tempdb..#t2') is not null 
    drop table #t2create table #t(編碼 varchar(10),接收人 varchar(100))
    INSERT #t SELECT 1,'0001,0003'
    UNION ALL SELECT 2,'0001,0002'
    UNION ALL SELECT 3,'0001,0002,0003'create table #t2(編碼 varchar(10),姓名 varchar(100))
    INSERT #t2 SELECT '0001','小明'
    UNION ALL SELECT  '0002','小麗'
    UNION ALL SELECT  '0003','小剛'select * from #t
    /*
    編碼 接收人
    1 0001,0003
    2 0001,0002
    3 0001,0002,0003
    */
    select * from #t2
    /*
    編碼 姓名
    0001 小明
    0002 小麗
    0003 小剛
    */declare @sql varchar(8000)
    set @sql='接收人'
    select @sql = 'replace(' + @sql + ', ''' + rtrim(編碼) + ''', ''' + 姓名 + ''')' from #t2 
    select @sql = 'select 編碼, ' + @sql + ' 接收人 from #t'
    exec(@sql)
    /*
    編碼 接收人
    1 小明,小剛
    2 小明,小麗
    3 小明,小麗,小剛
    */
      

  23.   

    不是吧。。
    个人认为
    oydu(海阔天空) 的写法太死了。。不适合通用 chinank(中国南开)的写法如果要实现个人分隔的话太复杂了。。如果可以拆分多条记录的话只需要一条语句就好
    select t2.编码,t1.接收人,t2.姓名,
    from #t1 t1, #t2 t2
    where charindex(rtrim(t2.编码), rtrim(t1.接收人1))>0还是qiuyun8m() 得写法好。。竟然没有得最多分哎。
      

  24.   

    呵呵!那天给分太着急了!没好好看看!
    chinank(中国南开)的写法是实现行变列的操作
    我用了qiuyun8m()方法做的!呵呵!
    以后大家要多多帮助我呀!分是没问题滴。。