这个数据怎么转换

hling 2009-06-20 04:51:12
有一表A:

id name
1 第一类,第二类
2 第一类,第三类
3 第三类,第二类
4 第五类,第一类

一表B:
name noid
第一类 1001
第二类 1002
第三类 1003
第四类 1004
第五类 1005
第六类 1006


如何让表A按表B变成:
id name
1 1001,1002
2 1001,1003
3 1003,1002
4 1005,1001








...全文
37 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jamin_Liu 2009-06-20
  • 打赏
  • 举报
回复
--測試數據
DECLARE @TA TABLE([id] INT, [name] NVARCHAR(20))
INSERT @TA
SELECT 1, N'第一类' UNION ALL
SELECT 2, N'第一类,第三类' UNION ALL
SELECT 3, N'第三类,第二类' UNION ALL
SELECT 4, N'第五类,第一类,第二类'

DECLARE @TB TABLE([name] NVARCHAR(3), [noid] INT)
INSERT @TB
SELECT N'第一类', 1001 UNION ALL
SELECT N'第二类', 1002 UNION ALL
SELECT N'第三类', 1003 UNION ALL
SELECT N'第四类', 1004 UNION ALL
SELECT N'第五类', 1005 UNION ALL
SELECT N'第六类', 1006
--結果
select MAX(t1.id) as id
,STUFF((select ','+cast(noid as varchar) as [text()]
from @TB t2
where t1.name like '%'+t2.name+'%'
for xml path(''))
,1,1,'') as name

from @TA t1
group by t1.name
order by id asc
ai_li7758521 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 csdyyr 的回复:]
SQL codeCREATE TABLE TA([id] INT, [name] NVARCHAR(11))
INSERT TA
SELECT 1, N'第一类' UNION ALL
SELECT 2, N'第一类,第三类' UNION ALL
SELECT 3, N'第三类,第二类' UNION ALL
SELECT 4, N'第五类,第一类' UNION ALL
SELECT 5, N'第一类,第三类,第四类'
GO

CREATE TABLE TB([name] NVARCHAR(3), [noid] INT)
INSERT TB
SELECT N'第一类', 1001 UNION ALL
SELECT N'第二类', 1002 UNION ALL
SELE…
[/Quote]正解
SQL77 2009-06-20
  • 打赏
  • 举报
回复

SELECT DISTINCT ID,
CASE WHEN EXISTS(SELECT 1 FROM @TB WHERE NAME=NAME1) THEN NOID END AS NAME1,
CASE WHEN EXISTS(SELECT 1 FROM @TB WHERE NAME=NAME2) THEN NOID END AS NAME2,
CASE WHEN EXISTS(SELECT 1 FROM @TB WHERE NAME=NAME3) THEN NOID END AS NAME3
FROM
(SELECT ID,LEFT(NAME,3)NAME1,''AS NAME2,''AS NAME3 FROM @TA WHERE LEN(NAME)=3
UNION ALL
SELECT ID,LEFT(NAME,3)NAME1,SUBSTRING(NAME,5,3)NAME2,''FROM @TA WHERE LEN(NAME)=7

UNION ALL
SELECT ID,LEFT(NAME,3)NAME1,SUBSTRING(NAME,5,3)NAME2,RIGHT(NAME,3) FROM @TA WHERE LEN(NAME)>7)AS T

LEFT JOIN @TB
ON T.NAME1=NAME OR (T.NAME1=NAME AND T.NAME2=NAME) OR (T.NAME1=NAME AND T.NAME2=NAME AND T.NAME3=NAME)

这样做太麻烦了!!!向高手学习!!
csdyyr 2009-06-20
  • 打赏
  • 举报
回复
CREATE TABLE TA([id] INT, [name] NVARCHAR(11))
INSERT TA
SELECT 1, N'第一类' UNION ALL
SELECT 2, N'第一类,第三类' UNION ALL
SELECT 3, N'第三类,第二类' UNION ALL
SELECT 4, N'第五类,第一类' UNION ALL
SELECT 5, N'第一类,第三类,第四类'
GO

CREATE TABLE TB([name] NVARCHAR(3), [noid] INT)
INSERT TB
SELECT N'第一类', 1001 UNION ALL
SELECT N'第二类', 1002 UNION ALL
SELECT N'第三类', 1003 UNION ALL
SELECT N'第四类', 1004 UNION ALL
SELECT N'第五类', 1005 UNION ALL
SELECT N'第六类', 1006
GO
CREATE FUNCTION getStr(@name NVARCHAR(11))
RETURNS NVARCHAR(100)
AS
BEGIN
DECLARE @RESULT NVARCHAR(100)
SET @RESULT=''
SELECT @RESULT=@RESULT+','+RTRIM([noid])
FROM TB
WHERE CHARINDEX([name],@name)>0
RETURN STUFF(@RESULT,1,1,'')
END
GO

SELECT id,dbo.getStr([name]) AS [name] FROM TA

DROP TABLE TA,TB
DROP FUNCTION getStr
/*
id name
----------- ----------------------------------------------------------------
1 1001
2 1001,1003
3 1002,1003
4 1001,1005
5 1001,1003,1004
*/
hling 2009-06-20
  • 打赏
  • 举报
回复
如果A变成:

id name
1 第一类
2 第一类,第三类
3 第三类,第二类
4 第五类,第一类
5 第一类,第三类,第四类

csdyyr 2009-06-20
  • 打赏
  • 举报
回复
DECLARE @TA TABLE([id] INT, [name] NVARCHAR(7))
INSERT @TA
SELECT 1, N'第一类,第二类' UNION ALL
SELECT 2, N'第一类,第三类' UNION ALL
SELECT 3, N'第三类,第二类' UNION ALL
SELECT 4, N'第五类,第一类'

DECLARE @TB TABLE([name] NVARCHAR(3), [noid] INT)
INSERT @TB
SELECT N'第一类', 1001 UNION ALL
SELECT N'第二类', 1002 UNION ALL
SELECT N'第三类', 1003 UNION ALL
SELECT N'第四类', 1004 UNION ALL
SELECT N'第五类', 1005 UNION ALL
SELECT N'第六类', 1006

SELECT id,name=(SELECT RTRIM([noid]) FROM @TB WHERE [name]=LEFT(T.[name], CHARINDEX(',',T.[name])-1))+','+
(SELECT RTRIM([noid]) FROM @TB WHERE [name]=STUFF(T.[name], 1, CHARINDEX(',',T.[name]), ''))
FROM @TA AS T
/*
id name
----------- -------------------------
1 1001,1002
2 1001,1003
3 1003,1002
4 1005,1001
*/
needanothercoder 2009-06-20
  • 打赏
  • 举报
回复
mark

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧