2015-05-12 2 views
0

Я пытаюсь запросить таблицу ниже в сводном и сортируется список, например:Рекурсивного Teradata 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 Britt, Babs, Beth 
3 Vlad, Mike, Eric 

Это необходимо использовать рекурсивный запрос, потому что список намного длиннее. Кроме того, я должен сортировать по my_rank, чтобы получить их в последовательном порядке. Заранее спасибо. Я пробовал около 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'); 

ответ

0

Что-то, как это должно работать:

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; 
+0

Спасибо за помощь! Я получаю сообщение об ошибке: «SELECT Failed 3500: неверный оператор SQL, ожидаемый DELETE INSERT PROCEDURE SELECT или UPDATE». Я использую sqad-помощник teradata, через базу данных через Access. Есть предположения? – user3565651

+0

Ваша СУБД - это доступ? Если это так, то def не будет работать. Вам понадобится VBA, и это будет некрасиво. – JNevill

+0

Я перевел базу данных за пределы доступа. Я получаю сообщение об ошибке «employees.EMP_NAME» не существует. Должно ли это быть «служащие. Сотрудники»? – user3565651

2

Что ваш релиз Teradata? Установлены ли XML-сервисы?

SELECT * FROM dbc.FunctionsV 
WHERE FunctionName = 'XMLAGG'; 

Если эта функция существует, вы можете избежать рекурсии (которая не очень эффективна в любом случае):

SELECT GROUP_ID, 
    TRIM(TRAILING ',' FROM 
      CAST(XMLAGG(EMP_NAME || ',' ORDER BY MY_RANK) AS VARCHAR(10000))) 
FROM MY_TEST 
GROUP BY 1 
+0

Еще один прекрасный ответ. Я нашел это, ища альтернативы рекурсии. В итоге мне пришлось использовать 'TRANSLATE_CHK', так как просто набор символов не мешал ошибкам« нетранслируемого ». –

Смежные вопросы