2015-01-30 2 views
0

두 개의 입력이있는 PL/pgSQL 저장 프로 시저를 작성해야합니다.
첫 번째 입력은 타임 스탬프 세트를 반환하는 select로 이동해야합니다.중첩 된 쿼리에서 결과 집합을 반환하는 PostgreSQL 함수

이러한 반환 된 타임 스탬프를 사용하여 두 번째 선택을 반복합니다. 두 번째 선택은 함수의 두 번째 입력을 받아 루프 반복에서 수집해야하는 단일 행을 반환합니다. 그런 다음 두 번째 선택의 출력을 어셈블하고 결과 집합으로 반환합니다.

FUNCTION (Input A B) 
SELECT FROM T1 WHERE X = A INTO RS1. 
LOOP VAL OVER RS1 
    Select FROM T2 WHERE Y = B AND Z = VAL INTO RS2 
END LOOP 
RETURN ASSEMBLED RS2 

누구나 내가 일할 수있는 작업 뼈대를 가리킬 수 있습니까? 설명서에서 필요한 관련 부분은 무엇입니까? 내가 필요가 있다고 생각 :

  • RETURNS TABLE() AS 그냥 사용하려고 첫 번째 쿼리의 결과

+3

왜 'join'을 사용하여 간단한 쿼리를 사용하면 쉽게이 작업을 수행 할 수 있습니까? –

+0

글쎄, 문제는 하나의 select가 when 절에서 <=를 사용하여 IN을 사용하지 못하게한다는 것입니다. 나는 그렇지 않다는 것을하지 않는다. – JohnDoe

+0

'JOIN'은 실제로'IN'과 관련이 없다 - 더 많은 내용을 읽을 수있다. (http://www.postgresql.org/docs/current/static/tutorial -join.html) – pozs

답변

0

를 사용하여, 결과는 두 번째 쿼리를 통해 루프

  • CURSOR을 설정 선언

    with T1_vals as (
        select val from T1 where X = A 
    ), T2_vals as (
        select T2.val from T2, T1_vals where T2.Z = T1_vals.val and T2.Y = B 
    ) select val from T2_vals; 
    
    을 사용하여 행에 대해 명시 적으로 반복을 시도하는 대신 Common Table Expressions

    일반적으로 SQL은 훨씬 더 나은 성능을 제공하는보다 단순한 솔루션을 제공하므로 값을 명시 적으로 반복하려는 경우주의하십시오.

  • 0

    커서, 중첩 함수 호출 또는 루프가 필요하지 않습니다.
    CTE도 필요하지 않습니다.

    JOIN로 매우 기본적인 쿼리를 사용

    SELECT t2.* 
    FROM t1 
    JOIN t2 ON t2.z = t1.val 
    WHERE t1.x = _input_a 
    AND t2.y = _input_b; 
    

    설정 기반 솔루션은 SQL의 절차 적 접근에 일반적으로 우수하다. 드문 경우이지만 루핑이 최상의 솔루션입니다.

    관련 문제