Проблема с вложенными левыми соединениями и объединением - PullRequest
3 голосов
/ 08 августа 2011

У меня странная проблема с вложенными левыми соединениями в 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

И это проблема - value2 не может быть NULL из-за COALESCE в sub4 (по крайней мере, я думаю, что это не может быть =)) В любом случае, если мы изменим

SELECT sub3.key3, sub4.value2 FROM

с

SELECT sub3.key3, value2 FROM

мы получим правильный результат:

key1;key3;value2
1;1;1

Что-то не так с моим умом и руками?или это баг?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Я получил ответ от команды postgresql.Вердикт:

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

Итак, это была (и есть) ошибка.Спасибо всем, кто принимал участие в этом выпуске!=)

1 голос
/ 08 августа 2011

Я перевел ваш запрос в синтаксис Oracle и получил ожидаемый результат

+------+------+--------+
| KEY1 | KEY3 | VALUE2 |
+------+------+--------+
|    1 |    1 |      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

Кроме того, после прочтения этого довольно странного запроса я все еще думаю, чторезультат, который вы получаете от Postgres, неверен.Я думаю, что вы можете спокойно отправить это сообщение об ошибке в Postgres

...