小菜鸟一只,大神勿喷。【乖巧】
两张表
aaa表
bbb表
bbb 表的modelid 是 aaa表的id值 字符串类型 组成 1,2这样的形式 并且不固定 也可能是1,2,3,4这种
需要得到的效果
将aaa表的name字段根据 bbb 表 的madelid字段中 id 的顺序显示到一个字段
用了sql中的STUFF函数
这个函数可以用来删除 或者是修改某段字符中的某几个字
第一次的代码如下:
select *,STUFF(modelid,1,len(modelid), ( select top 1 (select name+',' from aaa where id in (1,2) for xml path('') ) as hh from aaa t2 where id in (1,2)) ) as a from bbb
这句代码可以实现效果 但是美中不足的是 数据为写死的值 这样就导致了代码很不灵活
你会说 in中用 modelid代替好了 实验证明 这是行不通的 报错
那么这到底是作什么妖呢
原因是modleid值是varchar值 id是int值 正确的写法应该是 where id in(1,2,3)
而现在会变成 where id in(‘1,2,3’)
现在的问题是来解决将字符串类型改为int类型 圆满这次的sql语句
一般普通的 如果是只有一个值的情况下 可以直接转成int类型的值 但是这里是多个值 明显行不通 经过百度 找到一个方法 sql语句如下:
GO
CREATE FUNCTION fn_StringSplitTable
(
@str NVARCHAR(MAX),
@split NVARCHAR(10)
)
RETURNS TABLE
AS
RETURN
(
SELECT B.id
FROM
(
SELECT [value] = CONVERT(XML , '<v>' + REPLACE(@str , @split , '</v><v>') + '</v>')
) A
OUTER APPLY
(
SELECT id = N.v.value('.' , 'nvarchar(100)')
FROM A.[value].nodes('/v') N ( v )
) B
)
Go
select *,STUFF(modelid,1,len(modelid), ( select top 1 (select name+',' from aaa where id in (SELECT CAST(id AS INT) FROM dbo.fn_StringSplitTable(modelid, ',')) for xml path('') ) as hh from aaa t2 where id in (SELECT CAST(id AS INT) FROM dbo.fn_StringSplitTable(modelid, ','))) ) as a from bbb ;
注意 这一定要带上go 形成代码块
最后 问题圆满解决
需要注意的是:这里还用了个知识点 把表格多行值 放到了一个字段中
select id,(select name+',' from aaa where id in (1,2) for xml path('') ) as hh from aaa t2 where id in (1,2)
介于条件问题 会生成多行一样的语句 暂时没想到办法 我的解决方案是 只取了第一条
End