2011-08-08 3 views
3

을 병합 중첩 왼쪽 조인 PostgreSQL을에 ... 그것은) = 보여줄 설명하기 어려운,하지만, 쉽게 여기에서 우리는 다음과 같습니다문제 중첩 된 왼쪽 조인과 내가 이상한 문제가

SELECT * FROM 
(
    SELECT 1 as key1 
) sub1 
LEFT JOIN 
(
    SELECT sub3.key3, sub4.value2 FROM 
    (
     SELECT 1 as key3 
    ) sub3 
    LEFT JOIN 
    (
     SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 
     FROM 
     (
      SELECT 1 as key5 
     ) sub5 
     LEFT JOIN 
     (
      SELECT 1 as key6, value1 
      FROM 
      (
       SELECT NULL::integer as value1 
      ) sub7 
      WHERE false 
     ) sub6 ON false 

    ) 
    sub4 ON sub4.key5=sub3.key3 
) 
sub2 ON sub1.key1 = sub2.key3 

의 결과 이 쿼리 :

key1;key3;value2 
1;1;NULL 

그리고이 문제입니다 - 우리가

을 변경할 수 있습니다 경우 값 2가 어쨌든 때문에 (나는 그것을 할 수 있다고 생각 적어도 =) SUB4에 COALESCE) 의 NULL 일 수 없습니다
SELECT sub3.key3, sub4.value2 FROM 
손을 내 마음에 문제가

key1;key3;value2 
1;1;1 

있습니까 :

SELECT sub3.key3, value2 FROM 

우리는 올바른 결과를 가지고 있습니까? 또는 버그입니까?

미리 감사드립니다.

+0

테이블 정의와 데이터를 테이블에 게시하지 않으면 아무도이를 재현 할 수 없습니다. –

+0

@ 피터 : 어떤 테이블 정의? 테이블이 없습니다. –

+0

@listar, 비록 당신의 SQL이 정확히 이해하기가 쉽지 않더라도, 꽤 미친 결과입니다. 그러나 나는'value2 = 1'도 기대할 것입니다. 'COALESCE'를'CASE' 표현으로 표현해 보았습니까? –

답변

1

나는 postgresql 팀으로부터 대답을 얻었다. 평결 : 버그

This is on HEAD from today. Clearly there's a problem. 

그래서, 그것은이었다 (그리고 그것은이다). 이 문제에 참여한 모든 분들께 감사드립니다! =)

1

내가 오라클 구문 쿼리를 번역하고 내가 또한

SELECT * FROM (
    SELECT 1 as key1 from dual 
) sub1 
LEFT JOIN (
    SELECT sub3.key3, sub4.value2 FROM (
     SELECT 1 as key3 from dual 
    ) sub3 
    LEFT JOIN (
     SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 
     FROM (
      SELECT 1 as key5 from dual 
     ) sub5 
     LEFT JOIN (
      SELECT 1 as key6, value1 
      FROM (
       SELECT cast(NULL as NUMBER(7)) as value1 from dual 
      ) sub7 
      WHERE 1=0 
     ) sub6 ON 1=0 
    ) 
    sub4 ON sub4.key5 = sub3.key3 
) 
sub2 ON sub1.key1 = sub2.key3 

에 따른 예상 된 결과

+------+------+--------+ 
| KEY1 | KEY3 | VALUE2 | 
+------+------+--------+ 
| 1 | 1 |  1 | 
+------+------+--------+ 

를 얻을이 오히려 이상한 쿼리를 읽고, 나는 아직도 생각 결과 당신 Postgres에서 얻는 것이 잘못되었습니다. 나는 안전하게 Postgres에 버그로 신고 할 수 있다고 생각한다.

+0

많은 감사합니다 !!! 나는이 문제를 postgres 팀에 버그로보고 할 것입니다. – listar

+1

버그는 쿼리 실행 최적화 도구가 너무 낙관적으로 해석 할 수있는 "항상 거짓"상태와 관련이 있다고 생각합니다. –

+0

아마도 맞습니다.) 그러나 지금은 소스 코드 조사 만이 문제를 밝힐 수 있다고 생각하지만, 이전에 말했듯이 그러한 조사는 준비가되지 않았습니다.)) 나는 postgresql 팀과의 반응을 기다릴 것입니다.) – listar