2014-02-10 3 views
2

여기에 재귀 쿼리를 살펴 보았지만 문제가 발견되지 않았습니다. 그 외에도 postgreSQL을 처음 접했습니다.postgreSQL의 재귀 쿼리?

나는 예를 들어, 데이터를 다음과 같은 테이블이 있습니다

number numberto ab st kz pv 
112  200     
140  210     
200  210     
210  220   f2 140 H 2011 
220     f2 140 H 2011  

이 쿼리는 좀 더 복잡 할 것이다, 그러나 이것은 내가 해결할 수없는 부분입니다. numberto은 다른 number을 말한 다음 다시 입력 할 수 있습니다. 나는이 고리가 약 4 ~ 5 회 계속 될 수있다.

언젠가 다른 네 가지 색상은 NOT NULL이며 문자 및/또는 숫자로 채워집니다. ab에 내용이 있으면 다른 세 사람도 내용을 갖습니다. 마지막 coloumns가 채워지면 numberto은 더 이상 참조 할 수 있지만 동일하게 유지되므로 거기에서 멈출 수 있습니다.

내 문제 : 하나의 숫자에 대해 재귀 쿼리를 작성한 다음 numberto을 필요한만큼 여러 번 검색해야합니다. ab이 채워지고 그 출력을 얻습니다.

어떻게하면됩니까?


SELECT version(); 

x86_64에 알려지지-리눅스 GNU에 PostgreSQL의 9.2.6, gcc에서 컴파일 (수세 리눅스) 4.3.4 [GCC-4_3 분기 개정 152,973, 64 비트

+1

완전한 사례 (입력 및 예상 출력)를 표시 할 수있을만큼 유용한 데이터 샘플을 보여주십시오. 또한 PostgreSQL 버전을 제공하십시오. –

+0

샘플 데이터를 추가하고 버전()을 추가하려고했습니다. 산출. 이 대답을 향상시킬 수 있는지 알려주세요. :) – Trollwut

+1

좋아, 그래서 null이 아닌 데이터 열을 찾을 때까지 numberto -> 숫자 체인을 걸어 가고 싶어. 옳은? –

답변

2

이것은 매우 간단한 재귀 쿼리입니다. 재귀 용어에서 null이 아닌 행을 볼 때 중지됩니다. 을 감안할 때 the following sample table

:

WITH RECURSIVE chain AS 
(
    -- Start with the row with number=140 
    SELECT number, numberto, ab, st, kz, pv 
    FROM numbers n 
    WHERE n.number = 140 
    UNION ALL 
    -- and iteratively fetch the 'numberto' id'd row 
    SELECT n.number, n.numberto, n.ab, n.st, n.kz, n.pv 
    FROM chain c 
    INNER JOIN numbers n ON (c.numberto = n.number) 
    -- unless we've already found a non-null col in our last iteration 
    WHERE c.ab IS NULL 
) 
-- Find any non-null result. 
SELECT * 
FROM chain c 
WHERE c.ab IS NOT NULL; 

n.number = 140이 시작 조건 인 트릭을 수행해야한다.

null이 아닌 열을 찾거나 NULL 숫자 또는 일치하지 않는 numberto가 있으면 반복이 중지됩니다 (내부 조인은 행을 추가하지 않으므로).

+0

나는 이것을 지금 몇 시간 동안 시도했다 ... 두 번째 SELECT에서 "n"을 참조 할 수 있다고 확신 하는가? 내 SQL 프로그램은 "c"만을 허용하기 때문에 참조 용으로 ... – Trollwut

+0

@Trollwut 절대적으로 확실합니다. SQLFiddle 링크를 따라 서면으로 실행된다는 것을 보여줍니다. 그것을 반복 : http://sqlfiddle.com/#!15/41a9e/3 –

+0

Yessir, 또한 내 postgreSQL 버전과 함께 작동합니다. 하지만 문제가 있습니다. 행 중 하나가 실제로 LEFT JOIN 된 것입니다. 그런 다음 작동하지 않습니다. 그럼에도 불구하고 당신의 대답은 옳습니다 - 나는 내일 그것에 대해 연구 할 것입니다. – Trollwut