小菜鳥一只,大神勿噴谬擦∏芯啵【乖巧】
兩張表
?? aaa表
??? bbb表
bbb 表的modelid? 是 aaa表的id值?? 字符串類型? 組成 1,2這樣的形式 并且不固定? 也可能是1,2,3,4這種
需要得到的效果
將aaa表的name字段根據(jù) bbb 表 的madelid字段中 id? 的順序顯示到一個字段
?用了sql中的STUFF函數(shù)
這個函數(shù)可以用來刪除 或者是修改某段字符中的某幾個字
第一次的代碼如下:
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
這句代碼可以實(shí)現(xiàn)效果 但是美中不足的是? 數(shù)據(jù)為寫死的值? 這樣就導(dǎo)致了代碼很不靈活?
你會說? in中用 modelid代替好了? 實(shí)驗(yàn)證明 這是行不通的? 報(bào)錯
?
?那么這到底是作什么妖呢??
原因是modleid值是varchar值? id是int值?? 正確的寫法應(yīng)該是 where id in(1,2,3)
而現(xiàn)在會變成 where id in(‘1,2,3’)
現(xiàn)在的問題是來解決將字符串類型改為int類型? 圓滿這次的sql語句?
一般普通的 如果是只有一個值的情況下? 可以直接轉(zhuǎn)成int類型的值 但是這里是多個值? 明顯行不通 經(jīng)過百度? 找到一個方法? 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 形成代碼塊?
最后 問題圓滿解決?
需要注意的是:這里還用了個知識點(diǎn)? 把表格多行值? 放到了一個字段中
select? id,(select? name+','? from aaa where id in (1,2) for xml path('') ) as hh from aaa t2? where id in (1,2)
?
介于條件問題? 會生成多行一樣的語句? 暫時(shí)沒想到辦法 我的解決方案是? 只取了第一條
End