有两个表,表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)表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 小刚希望大家帮助呀!俺在线等!。。
解决方案 »
- Ajax开发模式问题
- winform验证,增加新用戶,此用戶要等多久才能使用
- 服务器端调出 confirm 如何获得选择的真或假
- URL重写
- gridview的DataFormatString4位小数,是0不显示,不是0全显示(急!)
- 50分请教:怎样在ASP.NET调用带输出参数的存储过程?以及ADO.NET级事务的实现.
- 怎样实现点击回车键,提交用户名密码的功能,菜鸟求救!
- Response.ContentType的问题
- vs.net2005部署水晶报表?
- 怎么在VS 2005 Global.asax中定义一个Sqlconnction的链接方法
- 你见过这样的程序吗
- GridView 合并单元格
2、SELECT FROM 表1 RIGHT JOIN 表2 ON 表1.接收人 = 表2.编号;右链取表2中所有记录
3、SELECT FROM 表1 INNER JOIN 表2 ON 表1.接收人 = 表2.编号;取所有记录
你还是没看明白我说的呀!
我的表是这样的:
表1: 编码 接收人
1 0001,0003
2 0001,0002
3 0001,0002,0003
表2: 编码 姓名
0001 小明
0002 小丽
0003 小刚
select 表1.编码,表2.姓名 from 表1 left join 表2 on 表1.接收人=表2.编码
晕!你好好看看我说的!!!
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 ] ] ]
(
@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',',')
=================================
这个过程也许对你有用
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 小明,小丽,小刚
谢谢两位!等下午我试试!现在要去吃饭了!呵呵!
解决了一定马上给大家分!
不建议你使用我写的那个方法能实现但一条SQL语句目前我也只会这么写了!
总之我测试过能实现你现在的要求的那个结果!
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)
给分
(
编码 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.编码
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)
------------------------------------------------
这个写法很别致哦。不错,
的确可以
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 小明,小麗,小剛
*/
个人认为
oydu(海阔天空) 的写法太死了。。不适合通用 chinank(中国南开)的写法如果要实现个人分隔的话太复杂了。。如果可以拆分多条记录的话只需要一条语句就好
select t2.编码,t1.接收人,t2.姓名,
from #t1 t1, #t2 t2
where charindex(rtrim(t2.编码), rtrim(t1.接收人1))>0还是qiuyun8m() 得写法好。。竟然没有得最多分哎。
chinank(中国南开)的写法是实现行变列的操作
我用了qiuyun8m()方法做的!呵呵!
以后大家要多多帮助我呀!分是没问题滴。。