一个字段包含多个用户ID,如何查出关联的用户?

2024-12-15 23:33:27
推荐回答(4个)
回答1:

你也没有说什么库,,给出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,'' + REPLACE([nodeuser], ',', '') + '') FROM node
)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

结果

张三,李四

张三,王五

张三,李四,王五

回答2:

你觉得这样的可以得出你想要的数据么?一个是数字类型的一个是字符类型的,如果真的想要用sql查询语句解决的话,必须先把表2的字段给拆分了,但不建议在数据库端做这样的字符操作

回答3:

在关联时用instr判断ID是否存在于nodeuser中,当然要适当补全分隔符才能精确
select instr(','||'1,3', ',1,') from dual;

回答4:

left on条件使用FIND_IN_SET函数,妥妥的