2016-06-11 9 views
0

Oracle에서 재귀 쿼리에 문제가 있습니다.SQL 재귀 쿼리 (Oracle)

현재 SQL Server에서 CTE를 사용하여 결과를 얻을 수 있지만 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 

,하지만 난 그것을 사용하는 방법을 모르겠어요.

실제로 최종 코드에서 테이블 dbo.chiffres 대신 "선택 ....."을 사용해야합니다.

이의 결과 "를 선택합니다 ...."입니다

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

그리고 난이 원하는 최종 결과를 (AN exemple를 juste)이 같은

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

Oracle에서 CTE가 작동합니다 (설명서에서 하위 쿼리 팩터링 절이라고 함). 상당히 쉽게 이식 할 수 있어야합니다. 'level'의 이름을'lvl'로 변경하십시오 -'level'은 계층 적 쿼리에서 사용되는 키워드이며 별칭으로 사용할 수 없습니다. – MT0

+0

답변 해 주셔서 감사합니다. 나는이 솔루션을 시도했다고 생각하지만 'SELECT 키워드가 누락되었습니다'라는 오류가 발생했습니다. 실제로 테이블 dbo.chiffres가 없기 때문에 내 문제는 좀 더 복잡하지만 '선택 ....'대신 사용할 수 있습니다. 이것이 문제의 근원이 될 수 있습니까? – 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은 계층 적 쿼리에 사용되는 키워드 임).
  • 문자열 연결 연산자는 +이 아니라 오라클의 경우 ||입니다.
  • 모든 캐스트가 삭제되었습니다. 필요하지 않다고 생각합니다.