IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
Go CREATE TABLE ta([id] INT,[name] NVARCHAR(4),[parentid] NVARCHAR(2))
Go INSERT INTO ta
SELECT 1,'河北省','0' UNION ALL
SELECT 2,'邢台市','1' UNION ALL
SELECT 3,'石家庄市','1' UNION ALL
SELECT 4,'张家口市','1' UNION ALL
SELECT 5,'南宫','2' UNION ALL
SELECT 6,'坝上','4' UNION ALL
SELECT 7,'任县','2' UNION ALL
SELECT 8,'清河','2' UNION ALL
SELECT 9,'河南省','0' UNION ALL
SELECT 10,'新乡市','9' UNION ALL
SELECT 11,'aaa','10' UNION ALL
SELECT 12,'bbb','10' GO --Start ;with district
as( select * from ta where [name]=N'河北省' union all select a.* from ta a,district b where a.parentid=b.id
) select * from district
--Result: /* id name parentid
----------- ---- -------- 1 河北省 0 2 邢台市 1 3 石家庄市 1 4 张家口市 1 6 坝上 4 5 南宫 2 7 任县 2 8 清河 2 */ 上面代码可以还不够清晰 给多一个例子
WITH district
--查询列
(PID, FDepartmentName,FState, FFatherName) AS
--父表
(SELECT PID, FDepartmentName,FState,CONVERT(nvarchar(50), '') AS FFatherName FROM dbo.T_Department WHERE (FParentUserID IS NULL or FParentUserID=0)
UNION ALL
--子表(注意是b的FDepartmentName)
SELECT a.PID, a.FDepartmentName,a.FState,b.FDepartmentName AS FFatherName FROM dbo.T_Department AS a
--关系
INNER JOIN district AS b ON a.FParentUserID = b.PID)
--查询
SELECT PID, FDepartmentName,FState, FFatherName
FROM district AS c