递归SQL查询不能给出正确的结果

时间:2015-10-12 02:48:46

标签: sql-server recursive-query

使用SQL Server,我有一个名为Prerequisites的表,其中包含两列:course_id和prereq_id。示例:my Prerequisites表如下所示: enter image description here

我需要一个查询,其中包含course_id所需的每个prereq_id ......如下所示:enter image description here

到目前为止,我已经能够得到一个部分列表,但它也添加了一个具有相同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

结果如下: enter image description here

1 个答案:

答案 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  |
+----------+-----------+