FROM의 하위 쿼리에는 별칭이 있어야합니다.


91

다음과 같은 오류를 반환하는 PostgreSQL로 작성한이 쿼리가 있습니다.

[Err] 오류 :
LINE 3 : FROM (SELECT DISTINCT (식별자) AS made_only_recharge

다음은 전체 쿼리입니다.

SELECT COUNT (made_only_recharge) AS made_only_recharge
FROM (
    SELECT DISTINCT (identifiant) AS made_only_recharge
    FROM cdr_data
    WHERE CALLEDNUMBER = '0130'
    EXCEPT
    SELECT DISTINCT (identifiant) AS made_only_recharge
    FROM cdr_data
    WHERE CALLEDNUMBER != '0130'
)

Oracle에서 잘 작동하는 유사한 쿼리가 있습니다. 유일한 변경 사항은 EXCEPTOracle에서 MINUS키워드 로 대체 한 것입니다 . 나는 Postgres를 처음 접했고 그것이 무엇을 요구하는지 모릅니다. 이것을 처리하는 올바른 방법은 무엇입니까?


3
첫 번째 where 절이 이미 예외를 제외하고 있으므로 예외가 필요하지 않습니다 CALLEDNUMBER = '0130'.
Clodoaldo Neto 2013

이 오류는 여전히 ... 포스트 그레스 (11) FWIW으로 발생
rogerdpack

답변:


134

ALIAS하위 쿼리에 추가 ,

SELECT  COUNT(made_only_recharge) AS made_only_recharge
FROM    
    (
        SELECT DISTINCT (identifiant) AS made_only_recharge
        FROM cdr_data
        WHERE CALLEDNUMBER = '0130'
        EXCEPT
        SELECT DISTINCT (identifiant) AS made_only_recharge
        FROM cdr_data
        WHERE CALLEDNUMBER != '0130'
    ) AS derivedTable                           -- <<== HERE

18
@JohnWoo 이것에 대해 감사하지만 왜 필요합니까 (여기서 이론 질문을하고 있다고 생각합니다)?
Andrew Cassidy

1
@AndrewCassidy 쿼리에 제약 조건을 더 추가 할 수 있도록 정의해야합니다 (WHERE derivedTable. <attribute> = 5). 그렇지 않으면 db가 하위 쿼리를 참조하는 방법을 알지 못합니다
stackhelper101

36
@AndrewCassidy 그것은 단지 불행한 구문입니다. 해당 하위 쿼리를 참조하지 않는 한 별칭이 무엇인지는 중요하지 않습니다. 개인적으로 저는를 사용 AS pg_sucks하고 있습니다. "글쎄요, 여기에 중복 식별자가 있지만 내부적으로 일부를 생성 할 수 있습니다. postgres!" :)
Tregoreg

1

중첩 테이블의 경우 일부 DBMS는 MySQL 및 Oracle과 같은 별칭을 사용해야하지만 다른 DBMS는 이러한 엄격한 요구 사항이 없지만 내부 쿼리의 결과를 대체하기 위해 추가 할 수 있습니다.


1
귀하의 문구는 Oracle과 MySQL 모두에 대해 그러한 요구 사항 있음을 시사 합니다. 내가 제대로 읽고 있습니까?
Scratte

@Scratte 나는 당신이 옳다고 생각하고 문구가 뒤집 혔습니다. "MySQL과 Oracle을 제외한 나머지"는 "Postgresql이지만 MySQL과 Oracle과 같은 다른 시스템"이어야한다고 생각합니다. 물론 그것은 여전히 ​​실행되는 문장이며 더 개선 될 수 있습니다. 2013 답변은 괜찮 으며이 답변은 아무것도 추가하지 않으므로 (필요한 경우 2013 답변에 대한 의견) 후자는 제거해야합니다.
제한 속죄
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.