Sql 递归Teradata查询

Sql 递归Teradata查询,sql,recursion,teradata,recursive-query,Sql,Recursion,Teradata,Recursive Query,我正在尝试将下表查询到一个合并和排序的列表中,例如: 开始列表: GROUP_ID MY_RANK EMP_NAME 1 1 Dan 1 2 Bob 1 4 Chris 1 3 Steve 1 5 Cal 2 1 Britt 2 2 Babs 2 3 Beth 3 1 Vlad 3 3 Eric 3 2 Mike 查询结果: 1 Dan, Bob, Steve, Chris, Cal 2 Br

我正在尝试将下表查询到一个合并和排序的列表中,例如:

开始列表:

GROUP_ID    MY_RANK EMP_NAME
1   1   Dan
1   2   Bob
1   4   Chris
1   3   Steve
1   5   Cal
2   1   Britt
2   2   Babs
2   3   Beth
3   1   Vlad
3   3   Eric
3   2   Mike
查询结果:

1   Dan, Bob, Steve, Chris, Cal
2   Britt, Babs, Beth
3   Vlad, Mike, Eric
它需要使用递归查询,因为列表要长得多。此外,我还必须按我的排名排序,以便按顺序获得它们。提前谢谢。我试过在不同论坛上找到的10个例子,但我被卡住了。另外,不要担心截断任何尾随/前导逗号

CREATE TABLE MY_TEST (GROUP_ID INTEGER NOT NULL, MY_RANK INTEGER NOT NULL, EMP_NAME VARCHAR(18) NOT NULL);
INSERT INTO MY_TEST VALUES (1, 1, 'Dan');
INSERT INTO MY_TEST VALUES (1, 2, 'Bob');
INSERT INTO MY_TEST VALUES (1, 4, 'Chris');
INSERT INTO MY_TEST VALUES (1, 3, 'Steve');
INSERT INTO MY_TEST VALUES (1, 5, 'Cal');
INSERT INTO MY_TEST VALUES (2, 1, 'Britt');
INSERT INTO MY_TEST VALUES (2, 2, 'Babs');
INSERT INTO MY_TEST VALUES (2, 3, 'Beth');
INSERT INTO MY_TEST VALUES (3, 1, 'Vlad');
INSERT INTO MY_TEST VALUES (3, 3, 'Eric');
INSERT INTO MY_TEST VALUES (3, 2, 'Mike');

像这样的方法应该会奏效:

WITH RECURSIVE employees(Group_ID , Employees, MY_RANK) AS
(
    --Recursive Seed
    SELECT
        GROUP_ID,
        --Cast as a big fat varchar so it can hold all of the employees in a list.
        CAST(EMP_NAME as VARCHAR(5000)),            
        --We need to include MY_RANK so we can choose the next highest rank in the recursive term below.
        MY_RANK 
    FROM
        MY_TEST
    WHERE
        --filter for only my_rank = 1 because that's where we want to start
        MY_RANK = 1

    UNION ALL

    --Recursive Term
    SELECT
        employees.GROUP_ID,
        employees.EMP_NAME || ', ' || MY_TEST.EMP_NAME,
        MY_TEST.MY_RANK
    FROM
        employees
        INNER JOIN MY_TEST ON

            --Joining on Group_id and Rank+1
            employees.GROUP_ID = MY_TEST.GROUP_ID AND
            employees.MY_RANK + 1 = MY_TEST.MY_RANK

)

SELECT GROUP_ID, Employees FROM employees;

像这样的方法应该会奏效:

WITH RECURSIVE employees(Group_ID , Employees, MY_RANK) AS
(
    --Recursive Seed
    SELECT
        GROUP_ID,
        --Cast as a big fat varchar so it can hold all of the employees in a list.
        CAST(EMP_NAME as VARCHAR(5000)),            
        --We need to include MY_RANK so we can choose the next highest rank in the recursive term below.
        MY_RANK 
    FROM
        MY_TEST
    WHERE
        --filter for only my_rank = 1 because that's where we want to start
        MY_RANK = 1

    UNION ALL

    --Recursive Term
    SELECT
        employees.GROUP_ID,
        employees.EMP_NAME || ', ' || MY_TEST.EMP_NAME,
        MY_TEST.MY_RANK
    FROM
        employees
        INNER JOIN MY_TEST ON

            --Joining on Group_id and Rank+1
            employees.GROUP_ID = MY_TEST.GROUP_ID AND
            employees.MY_RANK + 1 = MY_TEST.MY_RANK

)

SELECT GROUP_ID, Employees FROM employees;

像这样的方法应该会奏效:

WITH RECURSIVE employees(Group_ID , Employees, MY_RANK) AS
(
    --Recursive Seed
    SELECT
        GROUP_ID,
        --Cast as a big fat varchar so it can hold all of the employees in a list.
        CAST(EMP_NAME as VARCHAR(5000)),            
        --We need to include MY_RANK so we can choose the next highest rank in the recursive term below.
        MY_RANK 
    FROM
        MY_TEST
    WHERE
        --filter for only my_rank = 1 because that's where we want to start
        MY_RANK = 1

    UNION ALL

    --Recursive Term
    SELECT
        employees.GROUP_ID,
        employees.EMP_NAME || ', ' || MY_TEST.EMP_NAME,
        MY_TEST.MY_RANK
    FROM
        employees
        INNER JOIN MY_TEST ON

            --Joining on Group_id and Rank+1
            employees.GROUP_ID = MY_TEST.GROUP_ID AND
            employees.MY_RANK + 1 = MY_TEST.MY_RANK

)

SELECT GROUP_ID, Employees FROM employees;

像这样的方法应该会奏效:

WITH RECURSIVE employees(Group_ID , Employees, MY_RANK) AS
(
    --Recursive Seed
    SELECT
        GROUP_ID,
        --Cast as a big fat varchar so it can hold all of the employees in a list.
        CAST(EMP_NAME as VARCHAR(5000)),            
        --We need to include MY_RANK so we can choose the next highest rank in the recursive term below.
        MY_RANK 
    FROM
        MY_TEST
    WHERE
        --filter for only my_rank = 1 because that's where we want to start
        MY_RANK = 1

    UNION ALL

    --Recursive Term
    SELECT
        employees.GROUP_ID,
        employees.EMP_NAME || ', ' || MY_TEST.EMP_NAME,
        MY_TEST.MY_RANK
    FROM
        employees
        INNER JOIN MY_TEST ON

            --Joining on Group_id and Rank+1
            employees.GROUP_ID = MY_TEST.GROUP_ID AND
            employees.MY_RANK + 1 = MY_TEST.MY_RANK

)

SELECT GROUP_ID, Employees FROM employees;

您的Teradata版本是什么?是否安装了XML服务

SELECT * FROM dbc.FunctionsV
WHERE FunctionName = 'XMLAGG';
如果存在此函数,则可以避免递归(无论如何,递归不是很有效):


您的Teradata版本是什么?是否安装了XML服务

SELECT * FROM dbc.FunctionsV
WHERE FunctionName = 'XMLAGG';
如果存在此函数,则可以避免递归(无论如何,递归不是很有效):


您的Teradata版本是什么?是否安装了XML服务

SELECT * FROM dbc.FunctionsV
WHERE FunctionName = 'XMLAGG';
如果存在此函数,则可以避免递归(无论如何,递归不是很有效):


您的Teradata版本是什么?是否安装了XML服务

SELECT * FROM dbc.FunctionsV
WHERE FunctionName = 'XMLAGG';
如果存在此函数,则可以避免递归(无论如何,递归不是很有效):



谢谢你的帮助!我收到一个错误,“SELECT Failed 3500:无效的SQL语句,应为DELETE INSERT PROCEDURE SELECT或UPDATE”。我使用的是teradata sql assistant,数据库是通过Access访问的。有什么想法吗?你的RDBMS是Access?如果是这样,这个def就不起作用了。你需要一些VBA,它不会很漂亮。我在access之外转换了数据库。我收到一个错误“employees.EMP_NAME”不存在。那应该是“雇员,雇员”?是的,我道歉。应该是
employees.employees
。感谢您的帮助!我收到一个错误,“SELECT Failed 3500:无效的SQL语句,应为DELETE INSERT PROCEDURE SELECT或UPDATE”。我使用的是teradata sql assistant,数据库是通过Access访问的。有什么想法吗?你的RDBMS是Access?如果是这样,这个def就不起作用了。你需要一些VBA,它不会很漂亮。我在access之外转换了数据库。我收到一个错误“employees.EMP_NAME”不存在。那应该是“雇员,雇员”?是的,我道歉。应该是
employees.employees
。感谢您的帮助!我收到一个错误,“SELECT Failed 3500:无效的SQL语句,应为DELETE INSERT PROCEDURE SELECT或UPDATE”。我使用的是teradata sql assistant,数据库是通过Access访问的。有什么想法吗?你的RDBMS是Access?如果是这样,这个def就不起作用了。你需要一些VBA,它不会很漂亮。我在access之外转换了数据库。我收到一个错误“employees.EMP_NAME”不存在。那应该是“雇员,雇员”?是的,我道歉。应该是
employees.employees
。感谢您的帮助!我收到一个错误,“SELECT Failed 3500:无效的SQL语句,应为DELETE INSERT PROCEDURE SELECT或UPDATE”。我使用的是teradata sql assistant,数据库是通过Access访问的。有什么想法吗?你的RDBMS是Access?如果是这样,这个def就不起作用了。你需要一些VBA,它不会很漂亮。我在access之外转换了数据库。我收到一个错误“employees.EMP_NAME”不存在。那应该是“雇员,雇员”?是的,我道歉。应该是
employees.employees
。另一个很好的答案。我在寻找递归替代方法时发现了这一点。我最后也不得不使用
TRANSLATE\u CHK
,因为仅仅字符集并不能防止“不可翻译”的错误。另一个很好的答案。我在寻找递归替代方法时发现了这一点。我最后也不得不使用
TRANSLATE\u CHK
,因为仅仅字符集并不能防止“不可翻译”的错误。另一个很好的答案。我在寻找递归替代方法时发现了这一点。我最后也不得不使用
TRANSLATE\u CHK
,因为仅仅字符集并不能防止“不可翻译”的错误。另一个很好的答案。我在寻找递归替代方法时发现了这一点。我最后也不得不使用
TRANSLATE\u CHK
,因为仅仅字符集并不能防止“不可翻译”的错误。