2016-06-11 3 views
0

У меня проблема с рекурсивным запросом в Oracle.SQL-рекурсивный запрос (Oracle)

В настоящее время я могу получить результат с помощью CTE в SQL Server, но мне нужно адаптировать код для Oracle.

код я использую

WITH n(portefeuille, client, level, opcvm, ca, iter) AS 
(
    SELECT 
     portefeuille, client, 0 as level, opcvm, ca, 
     CAST(',' + CAST(portefeuille AS varchar) + ',' AS varchar) AS iter 
    FROM 
     dbo.chiffres 
    WHERE 
     opcvm IS NULL 

    UNION ALL 

    SELECT 
     m.portefeuille, n.client, n.level+1, m.opcvm, m.ca + n.ca, 
     CAST(iter + CAST(m.portefeuille AS varchar) + ',' AS varchar) AS iter 
    FROM 
     dbo.chiffres AS m 
    INNER JOIN 
     n ON n.portefeuille = m.opcvm 
) 
SELECT DISTINCT 
    n.level, n.client, n.portefeuille, n.ca , n.opcvm, iter, 
    (SELECT COUNT(*) 
    FROM n T1 
    WHERE T1.iter LIKE '%,' + CAST(n.portefeuille AS varchar) + ',%') - 1 AS Subordinates 
FROM 
    n, dbo.chiffres c 
WHERE 
    ((SELECT COUNT(*) 
     FROM n T1 
     WHERE T1.iter LIKE '%,' + CAST(n.portefeuille AS varchar) + ',%') - 1) = 0 
ORDER BY 
    level 

Я думаю, что я должен использовать «соединение по» в оракула, но я не знаю, как его использовать.

Фактически, в моем окончательном коде я использовал «select .....» вместо таблицы dbo.chiffres.

В результате этого "выбрать ...." есть (Juste в Exemple)

Client | portefeuille | CA | OPCVM 
31054 | 024   | 140   | NULL 
104900 | 034    |200   | 024 
31054 | 006    | 10   | NULL 

И конечный результат, что я хочу это

level | Client | portefeuille | CA | iter | subordinates 
0  | 31054 | 034   | 340   | ,024,034,  |0 
1  | 31054 | 006   | 10   | ,006,   |0 
+0

CTE работают в Oracle (это называется предложением факторинга подзапроса в документации) - вы должны легко переносить его. Переименовать 'level' в' lvl' - 'level' - это ключевое слово, используемое в иерархических запросах и не может использоваться как псевдоним. – MT0

+0

Благодарим вас за ответ. Я думаю, что я пробовал это решение, но получил сообщение об ошибке «Отсутствие ключевого слова SELECT». На самом деле моя проблема немного сложнее, потому что у меня нет таблицы dbo.chiffres, но вместо этого выберите «select ...». Может ли это быть источником проблемы? – Lamia

+0

Я добавил некоторые детали к своему сообщению, чтобы объяснить больше моей проблемы. – Lamia

ответ

1

Что-то вроде этого:

WITH n(portefeuille, client, lvl, opcvm, ca, iter) AS (
    SELECT portefeuille, 
      client, 
      0, 
      opcvm, 
      ca, 
      ',' || portefeuille 
    FROM dbo.chiffres 
    WHERE opcvm is null 
UNION ALL 
    SELECT m.portefeuille, 
      n.client, 
      n.lvl+1, 
      m.opcvm, 
      m.ca+n.ca, 
      iter || m.portefeuille || ',' 
FROM  dbo.chiffres m 
      inner join n 
      on n.portefeuille = m.opcvm 
) 
select distinct 
     n.lvl, 
     n.client, 
     n.portefeuille, 
     n.ca , 
     n.opcvm, 
     iter, 
     (SELECT COUNT(*) 
       FROM n T1 
       WHERE T1.iter LIKE '%,' || n.portefeuille || ',%' 
     ) - 1 AS Subordinates 
from n, 
     dbo.chiffres c 
where ((SELECT COUNT(*) FROM n T1 WHERE T1.iter LIKE '%,' || n.portefeuille || ',%') - 1) = 0 
order by lvl 

У меня нет таблиц, чтобы проверить его, но у меня есть

  • переименован level в lvl (как level - это ключевое слово, используемое в иерархических запросах).
  • Оператор конкатенации строк: || в Oracle, а не +.
  • Удалены все броски - я не думаю, что они вам нужны.