你也没有说什么库,,给出sqlserver05及以上版本的,,,
建立测试数据
CREATE TABLE [user](id INT,[name] VARCHAR(10))
go
CREATE TABLE node(id INT,nodeuser VARCHAR(10))
go
INSERT INTO [dbo].[user]
( [id], [name] )
SELECT 1,'张三'
UNION ALL
SELECT
2,'李四'
UNION ALL
SELECT
3,'王五'
GO
INSERT INTO dbo.node
( nodeuser )
SELECT
'1,2'
UNION ALL
SELECT
'1,3'
UNION ALL
SELECT
'1,2,3'
建立过程
create PROC test_sp
AS
BEGIN
/*
程式:twvampire
日期:2013-08-08
*/
SET NOCOUNT ON
CREATE TABLE #table(id INT IDENTITY(1,1),nodeuser VARCHAR(100))
CREATE TABLE #tableA(id INT ,[name] VARCHAR(50))
CREATE TABLE #tableB(nodeuser VARCHAR(100))
INSERT INTO #table
(nodeuser )
SELECT nodeuser
FROM dbo.node
INSERT INTO #tableA
( id, [name] )
SELECT T1.ID,T2.NAME
FROM
(
SELECT A.ID, B.value
FROM(
SELECT id, [value] = CONVERT(xml,'') FROM node ' + REPLACE([nodeuser], ',', ' ') + '
)A
OUTER APPLY(
SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
)B
) t1 ,[user] t2
WHERE t1.[VALUE]=t2.id
INSERT INTO #tableB
( nodeuser )
SELECT nodeuser
FROM
(
select DISTINCT id,
nodeuser=stuff((select ','+rtrim([name]) from #tableA where t.id=id
order by id DESC for xml path('')),1,1,'')
from #tableA t
) a
--SELECT * FROM #table
--SELECT * FROM #tableA
SELECT * FROM #tableB
DROP TABLE #table
DROP TABLE #tableA
DROP TABLE #tableB
SET NOCOUNT OFF
END
-----------------
执行过程,得到结果:
EXEC test_sp
结果
张三,李四
张三,王五
张三,李四,王五
你觉得这样的可以得出你想要的数据么?一个是数字类型的一个是字符类型的,如果真的想要用sql查询语句解决的话,必须先把表2的字段给拆分了,但不建议在数据库端做这样的字符操作
在关联时用instr判断ID是否存在于nodeuser中,当然要适当补全分隔符才能精确
select instr(','||'1,3', ',1,') from dual;
left on条件使用FIND_IN_SET函数,妥妥的