table a
E0,        E1,     E2,      E3,      
325 1 2 4
325 2 4 6
325 3 5 8
325 4 4 4
325 4 5 5
325 6 1 11
325 7 7 23
325 8 4 45
325 9 8 32
325 10 9 21
table  b
t1       t1code    t1value
325V1 1 S不分
325V1 2 未知
325V3 8 无品牌
325V1 9 花王碧柔
325V2 4 珈侬丁家宜
325V3 4 10g
325V1 3 强生可伶可俐
458V2 2 拉芳
325V1 4 好迪
574V1 10 隆力奇a表中需要经行匹配的段大概有15个也就是E1到E15,只拿三个作为例子
通过a 表中的E0与b表中t1的前三位相匹配,如果t1中v后的数字为1的话E1与t1code相匹配 确定能够确定唯一的t1value,这样只能一次匹配E1,如果t1中v后的数字为2的话E2与t1code相匹配 确定能够确定唯一的t1value
如何一次性把E1到E3 中在t1value中的值匹配出来。
现在我只能一次匹配出一列的,
结果如下
E0,   E1,  E1.value,   E2,      E3,      
325   1  S不分6020      2      4
而我想一次性到得
E0,   E1,  E1.value, E2, E2.value  E3,E3.value  一直到E3对应的值
325   1    S不分6020   2    拉芳     4   10g
请高数相助

解决方案 »

  1.   

    看来要用到行转列了。不知楼主Sql是哪个版本。
      

  2.   

    select a.E0,a.E1,b.t1value,a.E2,c.t1value,a.E3,d.t1value
    from a
    left join b on a.e1=b.t1code
    left join b as c on a.e2=c.t1code
    left join b as d on a.e2=d.t1code
      

  3.   

    JOSY 的方法会将a表中的内容增加很多条的,所以不是很合适。
    前提是不能增加也不能减少a表中的条数。
      

  4.   

    ---测试数据---
    if object_id('[a]') is not null drop table [a]
    go
    create table [a]([E0] int,[E1] int,[E2] int,[E3] int)
    insert [a]
    select 325,1,2,4 union all
    select 325,2,4,6 union all
    select 325,3,5,8 union all
    select 325,4,4,4 union all
    select 325,4,5,5 union all
    select 325,6,1,11 union all
    select 325,7,7,23 union all
    select 325,8,4,45 union all
    select 325,9,8,32 union all
    select 325,10,9,21
    if object_id('[b]') is not null drop table [b]
    go
    create table [b]([t1] varchar(5),[t1code] int,[t1value] varchar(12))
    insert [b]
    select '325V1',1,'S不分' union all
    select '325V1',2,'未知' union all
    select '325V3',8,'无品牌' union all
    select '325V1',9,'花王碧柔' union all
    select '325V2',4,'珈侬丁家宜' union all
    select '325V3',4,'10g' union all
    select '325V1',3,'强生可伶可俐' union all
    select '458V2',2,'拉芳' union all
    select '325V1',4,'好迪' union all
    select '574V1',10,'隆力奇'
     
    ---查询---
    select a.E0,a.E1,b.t1value,a.E2,c.t1value,a.E3,d.t1value
    from a
    left join b on a.e0=left(b.t1,3) and right(b.t1code,1)=1
    left join b as c on a.e0=left(c.t1,3) and right(c.t1code,1)=2
    left join b as d on a.e0=left(d.t1,3) and right(d.t1code,1)=3---结果---
    E0          E1          t1value      E2          t1value      E3          t1value
    ----------- ----------- ------------ ----------- ------------ ----------- ------------
    325         1           S不分          2           未知           4           强生可伶可俐
    325         2           S不分          4           未知           6           强生可伶可俐
    325         3           S不分          5           未知           8           强生可伶可俐
    325         4           S不分          4           未知           4           强生可伶可俐
    325         4           S不分          5           未知           5           强生可伶可俐
    325         6           S不分          1           未知           11          强生可伶可俐
    325         7           S不分          7           未知           23          强生可伶可俐
    325         8           S不分          4           未知           45          强生可伶可俐
    325         9           S不分          8           未知           32          强生可伶可俐
    325         10          S不分          9           未知           21          强生可伶可俐(10 行受影响)
      

  5.   

    修正一下
    ---查询---
    select a.E0,a.E1,b.t1value,a.E2,c.t1value,a.E3,d.t1value
    from a
    left join b on a.e0=left(b.t1,3) and right(b.t1,1)=1 and a.e1=b.t1code
    left join b as c on a.e0=left(c.t1,3) and right(c.t1,1)=2 and a.e2=c.t1code
    left join b as d on a.e0=left(d.t1,3) and right(d.t1,1)=3 and a.e3=d.t1code---结果---
    E0          E1          t1value      E2          t1value      E3          t1value
    ----------- ----------- ------------ ----------- ------------ ----------- ------------
    325         1           S不分          2           NULL         4           10g
    325         2           未知           4           珈侬丁家宜        6           NULL
    325         3           强生可伶可俐       5           NULL         8           无品牌
    325         4           好迪           4           珈侬丁家宜        4           10g
    325         4           好迪           5           NULL         5           NULL
    325         6           NULL         1           NULL         11          NULL
    325         7           NULL         7           NULL         23          NULL
    325         8           NULL         4           珈侬丁家宜        45          NULL
    325         9           花王碧柔         8           NULL         32          NULL
    325         10          NULL         9           NULL         21          NULL(10 行受影响)
      

  6.   

    --------------------------------------------------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2010-04-11 14:44:18
    --  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
    --          Jul  9 2008 14:43:34 
    --          Copyright (c) 1988-2008 Microsoft Corporation
    --          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
    --------------------------------------------------------------------------
    --> 生成测试数据表:aIF NOT OBJECT_ID('[a]') IS NULL
    DROP TABLE [a]
    GO
    CREATE TABLE [a]([E0] INT,[E1] INT,[E2] INT,[E3] INT)
    INSERT [a]
    SELECT 325,1,2,4 UNION ALL
    SELECT 325,2,4,6 UNION ALL
    SELECT 325,3,5,8 UNION ALL
    SELECT 325,4,4,4 UNION ALL
    SELECT 325,4,5,5 UNION ALL
    SELECT 325,6,1,11 UNION ALL
    SELECT 325,7,7,23 UNION ALL
    SELECT 325,8,4,45 UNION ALL
    SELECT 325,9,8,32 UNION ALL
    SELECT 325,10,9,21
    GO
    --SELECT * FROM [a]--> 生成测试数据表:bIF NOT OBJECT_ID('[b]') IS NULL
    DROP TABLE [b]
    GO
    CREATE TABLE [b]([t1] NVARCHAR(10),[t1code] INT,[t1value] NVARCHAR(10))
    INSERT [b]
    SELECT '325V1',1,N'S不分' UNION ALL
    SELECT '325V1',2,N'未知' UNION ALL
    SELECT '325V3',8,N'无品牌' UNION ALL
    SELECT '325V1',9,N'花王碧柔' UNION ALL
    SELECT '325V2',4,N'珈侬丁家宜' UNION ALL
    SELECT '325V3',4,'10g' UNION ALL
    SELECT '325V1',3,N'强生可伶可俐' UNION ALL
    SELECT '458V2',2,N'拉芳' UNION ALL
    SELECT '325V1',4,N'好迪' UNION ALL
    SELECT '574V1',10,N'隆力奇'
    GO
    --SELECT * FROM [b]-->SQL查询如下:
    create function fn_getname(@E0 int,@En int)
    returns varchar(20)
    as
    begin
    return(
    select top 1 [t1value] from b 
    where [t1code]=@En
    and @E0=left(t1,len(@E0))
    order by t1 desc
    )
    end
    go
    declare @s varchar(8000)
    select @s=ISNULL(@s+',','select [E0],')+QUOTENAME(name)+',['+name+'.Value]=dbo.fn_getname(E0,'+QUOTENAME(name)+')'
    from syscolumns 
    where id=OBJECT_ID('a')
    and name<>'E0'
    exec(@s+' from a')
    /*
    E0          E1          E1.Value             E2          E2.Value             E3          E3.Value
    ----------- ----------- -------------------- ----------- -------------------- ----------- --------------------
    325         1           S不分                  2           未知                   4           10g
    325         2           未知                   4           10g                  6           NULL
    325         3           强生可伶可俐               5           NULL                 8           无品牌
    325         4           10g                  4           10g                  4           10g
    325         4           10g                  5           NULL                 5           NULL
    325         6           NULL                 1           S不分                  11          NULL
    325         7           NULL                 7           NULL                 23          NULL
    325         8           无品牌                  4           10g                  45          NULL
    325         9           花王碧柔                 8           无品牌                  32          NULL
    325         10          NULL                 9           花王碧柔                 21          NULL(10 行受影响)
    */
      

  7.   

    可能是我有些着急 写的不是很清楚,首先谢谢大家的帮助
    a表中E1到E3 中每个段在 在b 表中的t1 段中都会有唯一确定的值与之对应。因为原始表太数据只是取了几条
    对应关系是这个样子的
    b表中t1中的内容比如325V1决定了 由a表中E1的能容与b表中的t1code对应相等后,取t1vaule的值
    也就是v1决定用E1与t1code比较相等后取t1vaule的值作为E1.value
    即 例如 325V1 决定E1=1 与t1code=1相等 取t1vaule='S不分' 为 E1.value
       例如 325V2 决定E2=4 与t1code=4相等 取t1vaule='珈侬丁家宜' 为 E2.value
    也就是V 后面的数字决定了用E1或是E2或是E3字段,去与t1code关联,如果内容相等就去相应的t1vaule 作为E.(v后面的数字)value
       
      

  8.   

    SELECT '325V2',4,N'珈侬丁家宜' UNION ALL
    SELECT '325V3',4,'10g' UNION ALL
    SELECT '325V1',4,N'好迪' UNION ALL就说这三条,是不是取值时取最后一个版本:325V3,是的话就和我想的一致,否则还需改代码。