WITH locs(id,id_source,name)
AS
(
SELECT id,id_source,name FROM Users WHERE id=5--用户id
UNION ALL
SELECT A.id,A.id_source,A.name FROM Users A,locs B where
b.id_source=a.id
)
select [id],[name],[id_source] from locs
请问这是sqlserver还是mysql的?
@梦幻迷烟: sqlserver
@四毛的家: 我用的mysql,不好意思没说明白
多谢,此方法我已实践,传入单个参数,可以快速得到他的所有父级id,但是我把整个函数作为条件去查询整个符合条件的表数据时,查询非常缓慢。我把单独运行的数据拿出来直接用in是很快的,单独函数也很快,但是合起来就很慢了.
我运行的sql如下,
select * from database.table a
where a.id in (queryChildrenAreaInfo('54160'));
王五的id=3,查出id_source=2,再找id_source<2的不就是他的所有上级麽,最后可以根据id_source正序排一下,那么得到的结果就是王五的所有上级信息,并且有顺序。
这里的序号并没有大小的区别,是随机生成的,不能用大小区别
@梦幻迷烟: 好吧,我理解错了
@梦幻迷烟: 我模拟了下数据,写了一段SQL,可以用了,你可以参考一下:
mssql写的,mysql可能语法上有点区别,但是思路是可以用,你试试~
CREATE TABLE #info( id INT , NAME NVARCHAR(56) ) DECLARE @CURRID INT ; DECLARE @NAME NVARCHAR(56) ; SET @CURRID=3;--王五的ID WHILE @CURRID>0 BEGIN SELECT @CURRID=ID_Source,@NAME=Name FROM dbo.T2 WITH(NOLOCK) WHERE ID=@CURRID INSERT INTO #info SELECT @CURRID,@NAME END SELECT * FROM #info DROP TABLE #info
//存储过程 递归
CREATE proc [dbo].[proc_Team]('传入老王的ID' int)
as
WITH Emp
AS ( SELECT * FROM dbo.A
WHERE id='传入老王的ID'
UNION ALL
SELECT d.* FROM Emp
INNER JOIN dbo.A d ON d.id_source = Emp.id
)
SELECT *
FROM Emp where id!='传入老王的ID'
GO
//SQL 语句这样写 亲测有效
WITH Emp AS ( SELECT * FROM A
WHERE id='老王的ID'
UNION ALL
SELECT * FROM Emp
INNER JOIN A AS d ON d.id_source = Emp.id
)
SELECT * FROM Emp where id!='老王的ID'
sqlserver的吗?我需要mysql的
自链接就行了
当有多串这样的数据,只知道一串数据结尾参数的一个字段条件,查出整串数据,自连接不够用。你能写出这样的sqll,查出一串数据?
@梦幻迷烟: 就是说你查的字段是动态的 有几个上级 显示几列?
@梦幻迷烟: 也可以在程序中实现呀