使用SQL Server,我有一个名为Prerequisites的表,其中包含两列:course_id和prereq_id。示例:my Prerequisites表如下所示:
我需要一个查询,其中包含course_id所需的每个prereq_id ......如下所示:
到目前为止,我已经能够得到一个部分列表,但它也添加了一个具有相同group_id / course_id的行。例如:对于BIO-102,它给出了值MATH-120,BIO-101和BIO-102,最后一个不需要..而且它没有列出BIO-101的任何先决条件,这是我当前的查询:
;WITH CTE
AS
(
SELECT DISTINCT
M1.course_id group_id,
M1.course_id
FROM Prerequisites M1
LEFT JOIN Prerequisites M2
ON M1.course_id = M2.prereq_id
WHERE M2.course_id IS NULL
UNION ALL
SELECT
C.group_id,
M.prereq_id
FROM CTE C
JOIN Prerequisites M
ON C.course_id = M.course_id
)
SELECT * FROM CTE ORDER BY group_id
答案 0 :(得分:0)
看起来简单的递归查询就足够了。 SQL Fiddle
DECLARE @T TABLE (course_id varchar(50), prereq_id varchar(50));
INSERT INTO @T (course_id, prereq_id) VALUES
('BIO-101', 'MATH-120'),
('BIO-102', 'BIO-101'),
('BIO-103', 'BIO-102'),
('BIO-103', 'MATH-130');
WITH
CTE
AS
(
SELECT
course_id AS group_id
,prereq_id AS course_id
FROM @T
UNION ALL
SELECT
CTE.group_id
,T.prereq_id AS course_id
FROM
CTE
INNER JOIN @T AS T ON T.course_id = CTE.course_id
)
SELECT *
FROM CTE
ORDER BY group_id, course_id;
<强>结果强>
+----------+-----------+
| group_id | course_id |
+----------+-----------+
| BIO-101 | MATH-120 |
| BIO-102 | BIO-101 |
| BIO-102 | MATH-120 |
| BIO-103 | BIO-101 |
| BIO-103 | BIO-102 |
| BIO-103 | MATH-120 |
| BIO-103 | MATH-130 |
+----------+-----------+