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

这就是问题所在 - value2 不能为 NULL,因为 sub4 中的 COALESCE (至少我认为它不能是 =))无论如何,如果我们要改变

SELECT sub3.key3, sub4.value2 FROM

SELECT sub3.key3, value2 FROM

我们会得到正确的结果:

key1;key3;value2
1;1;1

我的思想和手有什么问题吗?或者它是一个错误?

提前致谢!

4

2 回答 2

1

我已将您的查询翻译成 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

于 2011-08-08T12:45:36.940 回答
1

我得到了 postgresql 团队的回答。判决:

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

所以,它是(现在也是)一个错误。感谢所有参与此问题的人!=)

于 2011-08-08T17:47:13.453 回答