2017-12-08 15 views
0

사이의 열 비교 모호 :<column> 내가이 포스트 그레스 기능이 작동하려면 두 테이블

CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results() 
    returns table(match_id BIGINT) 
as 
$$ 
BEGIN 
    return QUERY 
    SELECT * 
    FROM sports.match_history  
    WHERE match_id NOT IN (SELECT match_id 
         FROM sports.match_results); 
END $$ 
LANGUAGE 'plpgsql'; 

이 혼자 쿼리를 서 잘 작동 :

SELECT * 
FROM sports.match_history 
WHERE match_id NOT IN (SELECT match_id FROM sports.match_results); 

을하지만이 기능에 넣어 때 이것을 다음과 같이 실행 해보십시오 :

select * 
from difference_of_match_ids_in_match_history_and_match_results(); 

나는 이것을 얻습니다 :

SQL Error [42702]: ERROR: column reference "match_id" is ambiguous
Detail: It could refer to either a PL/pgSQL variable or a table column. Where: PL/pgSQL function difference_of_match_ids_in_match_history_and_match_results() line 3 at RETURN QUERY

나는이 같은 오류와 다른 질문을 본 적이, 그리고 그들은, 그러나, 그 예 조인을 사용하면 참조하고 열의있는 인스턴스를 지정하는 서브 쿼리의 이름을 지정 제안 및 내 쿼리는 외부에서 잘 작동 함수의.

열의 이름을 지정해야하는 경우 하나의 하위 쿼리 만 사용하면 어떻게됩니까?

그게 문제가 아니라면, 내가 함수를 정의하는 방식에 문제가 있다고 가정합니다.

답변

1

당신은 괜찮습니다. 모호성은 returns table(match_id BIGINT)에서 이름을 바꾸거나

CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results() 
    returns table(new_name BIGINT) 
as 
$$ 
BEGIN 
    return QUERY 
    SELECT * 
    FROM sports.match_history  
    WHERE match_id NOT IN (SELECT match_id 
         FROM sports.match_results); 
END $$ 
LANGUAGE 'plpgsql'; 

또는

CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results() 
    returns table(match_id BIGINT) 
as 
$$ 
BEGIN 
    return QUERY 
    SELECT sports.match_history.match_id 
    FROM sports.match_history  
    WHERE sports.match_history.match_id NOT IN (SELECT sports.match_results.match_id 
         FROM sports.match_results); 
END $$ 
LANGUAGE 'plpgsql'; 

이 코드를 테스트하지 않았 쿼리에 테이블 이름과 열을 접두사 match_id에 있습니다.

+0

작품을 지금. 감사! – Maz

1

결과 집합의 구조는 함수 결과 형식과 일치해야합니다. 당신이 얻고 싶은 경우에 만 match_ids :

CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results() 
    RETURNS TABLE(m_id BIGINT) -- !! 
AS 
$$ 
BEGIN 
    RETURN QUERY 
    SELECT match_id    -- !! 
    FROM sports.match_history  
    WHERE match_id NOT IN (SELECT match_id 
         FROM sports.match_results); 
END $$ 
LANGUAGE 'plpgsql'; 

당신이 결과로 전체 행을 얻고 싶은 경우에 : 다른 사람이 answerd을 가지고

, 그것은 결과 정의 및 PL/pgSQL의 변수 사이의 모호성이다
DROP FUNCTION difference_of_match_ids_in_match_history_and_match_results(); 
CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results() 
    RETURNS SETOF sports.match_history -- !! 
AS 
$$ 
BEGIN 
    RETURN QUERY 
    SELECT *        -- !! 
    FROM sports.match_history  
    WHERE match_id NOT IN (SELECT match_id 
         FROM sports.match_results); 
END $$ 
LANGUAGE 'plpgsql'; 
1

을 . 집합 반환 함수의 열 이름은 실제로 함수 내부의 변수이기도합니다.

하지만 처음에는 PL/pgSQL이 필요하지 않습니다. 당신은 일반 SQL 함수를 사용하는 경우가 더 효율적입니다 및 문제뿐만 아니라 멀리 갈 것입니다 : 언어 이름은 식별자이며, 전혀 인용되지 않아야 함을

CREATE OR REPLACE FUNCTION difference_of_match_ids_in_match_history_and_match_results() 
    returns table(match_id BIGINT) 
as 
$$ 
    SELECT match_id --<< do not return * - only return one column 
    FROM sports.match_history  
    WHERE match_id NOT IN (SELECT match_id 
         FROM sports.match_results); 
$$ 
LANGUAGE sql; 

참고.

0

열 이름과 plpgsql OUT 매개 변수 사이의 이름 충돌이 해결되었습니다. 여기 자세한 내용은 :

나는 또한 다른 쿼리 스타일을 사용합니다. NOT IN (SELECT ...)은 일반적으로 가장 느리고 NULL 값을 갖는 트랩을 전달합니다.대신 NOT EXISTS를 사용

SELECT match_id 
FROM sports.match_history h 
WHERE NOT EXISTS (
    SELECT match_id 
    FROM sports.match_results 
    WHERE match_id = h.match_id 
    ); 

더 :