Test Test Ответов: 1

Помочь мне достичь этого результата запроса, как показано ниже заданного результата


помогите мне достичь этого результата

Output has only 2 columns 
1. Text: Displayed in image
2. Id: ID of the last subject (last child)


ВЫХОД:
Имя Id
Бухгалтерия &ГТ; начисление заработной платы &ГТ; шалфей заработной платы 5

Это всего лишь образец

Что я уже пробовал:

CREATE TABLE Subjects
(
SubjectId INT PRIMARY KEY IDENTITY(1,1),
Subject VARCHAR(70),
ParentSubjectId INT,
IsActive BIT,
CreatedDate DATETIME,
CreatedBy INT,
UpdatedDate DATETIME,
UpdatedBy INT
);



INSERT INTO Subjects (Subject, ParentSubjectId) VALUES ('Accountancy',0);

INSERT INTO Subjects (Subject, ParentSubjectId) VALUES ('Accounting',1);
INSERT INTO Subjects (Subject, ParentSubjectId) VALUES ('Bookkipping',1);
INSERT INTO Subjects (Subject, ParentSubjectId) VALUES ('Payroll',1);

INSERT INTO Subjects (Subject, ParentSubjectId) VALUES ('Sage Payroll',4);



  SELECT * FROM Subjects

1 Ответов

Рейтинг:
4

Maciej Los

Вы можете использовать КТОС[^] для такого требования. Видеть:

DECLARE @Subjects TABLE
(
	SubjectId INT PRIMARY KEY IDENTITY(1,1),
	SubjectText VARCHAR(70),
	ParentSubjectId INT
);

INSERT INTO @Subjects (SubjectText, ParentSubjectId)
VALUES ('Accountancy',0),('Accounting',1),
('Bookkipping',1),('Payroll',1),
('Sage Payroll',4)

--find the highset value of ParentSubjectId
DECLARE @lastid INT
SELECT @lastid = MAX(ParentSubjectId) FROM @Subjects
--get corresponding SubjectId
SELECT @lastid = MAX(SubjectId) FROM @Subjects WHERE ParentSubjectId = @lastid

--get data
;WITH CTE AS
(
	--initial query
	SELECT SubjectId, SubjectText, ParentSubjectId, CAST(SubjectText + ' > ' AS NVARCHAR(MAX)) AS LongSubject, 1 As LoopNo
	FROM @Subjects
	WHERE ParentSubjectId = 0
	--recursive part
	UNION ALL
	SELECT s.SubjectId, s.SubjectText, s.ParentSubjectId, LongSubject + s.SubjectText + ' > ' AS LongSubject, LoopNo + 1 As LoopNo
	FROM CTE AS c
		INNER JOIN @Subjects As s ON c.SubjectId = s.ParentSubjectId
)
SELECT LongSubject, SubjectId, LoopNo AS DataLevel
FROM CTE
WHERE SubjectId = @lastid


Результат:
LongSubject								SubjectId	DataLevel
Accountancy > Payroll > Sage Payroll > 		5		3


Не стесняйтесь улучшать приведенный выше код в соответствии с вашими потребностями.