【问题标题】:Oracle query not returning null valuesOracle 查询不返回空值
【发布时间】:2015-05-22 21:50:01
【问题描述】:

我期望以下查询在使用左连接时返回 WEBSITE_URL 表中没有匹配行的空行。 所以我想看到的是来自 URLTYPE 表的所有 url 类型以及 WEBSITE_URL 表中的任何匹配记录。

SELECT
    WU.NC_WEBSITE_ID_FK,
    WU.TC_URL,
    UT.TC_URLTYPE_NAME
  FROM
    WEBSITE_URL WU,
    URLTYPE UT
  WHERE
    WU.NC_URL_TYPE_ID_FK(+) = UT.NC_URLTYPE_ID
  AND
    NC_WEBSITE_ID_FK = '1622'

这是输出:

1622    http://www.test.com                 PRODUCTION (PUBLIC)

1622    http://preprod.test.com             PREPRODUCTION

1622    http://review.test.com              REVIEW

【问题讨论】:

  • select * from WEBSITE_URL where NC_WEBSITE_ID_FK = '1622' and NC_URL_TYPE_ID_FK not in (select NC_URLTYPE_ID from URLTYPE)

标签: sql oracle


【解决方案1】:

试试这个:

SELECT
    WU.NC_WEBSITE_ID_FK,
    WU.TC_URL,
    UT.TC_URLTYPE_NAME
  FROM
    URLTYPE UT
  LEFT JOIN 
    WEBSITE_URL WU ON WU.NC_URL_TYPE_ID_FK = UT.NC_URLTYPE_ID
               AND WU.NC_WEBSITE_ID_FK = '1622'

【讨论】:

    【解决方案2】:

    使用标准连接类型(在这种情况下为外部或左侧),而不仅仅是旧的 sql 语法

    SELECT WU.NC_WEBSITE_ID_FK, WU.TC_URL, UT.TC_URLTYPE_NAME
    FROM URLTYPE UT
    FULL OUTER JOIN WEBSITE_URL WU ON UT.NC_URLTYPE_ID = WU.NC_URL_TYPE_ID_FK(+)
    WHERE NC_WEBSITE_ID_FK = '1622'
    

    【讨论】:

    • 请添加一些上下文而不是仅仅吐出一些代码。
    【解决方案3】:

    首先,学会使用显式的join 语法。很少有人真正理解旧的 Oracle 语法了。

    其次,在所有列上使用表别名。

    如果NC_WEBSITE_ID_FK来自WEBSITE_URL,则需要将条件移至ON子句:

    SELECT WU.NC_WEBSITE_ID_FK, WU.TC_URL, UT.TC_URLTYPE_NAME
    FROM URLTYPE LEFT JOIN
         WEBSITE_URL WU
         ON WU.NC_URL_TYPE_ID_FK = UT.NC_URLTYPE_ID AND
            NC_WEBSITE_ID_FK = '1622';
    

    另外,如果NC_WEBSITE_ID_FK 是一个数字,不要将常量值放在单引号中。混合数据类型对人和优化器都会产生误导。

    【讨论】:

    • 这接近于我所追求的输出,唯一没有做的是在空行中输出 NC_WEBSITE_ID_FK,我不确定这是否可能。
    • @JeepersCreepers 。 . .如果没有匹配项,该列的值如何?
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2016-06-29
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多