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
请高数相助
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
请高数相助
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
前提是不能增加也不能减少a表中的条数。
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 行受影响)
---查询---
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 行受影响)
-- 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 行受影响)
*/
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
SELECT '325V3',4,'10g' UNION ALL
SELECT '325V1',4,N'好迪' UNION ALL就说这三条,是不是取值时取最后一个版本:325V3,是的话就和我想的一致,否则还需改代码。