【问题标题】:using DECODE with FIRST ORDER_BY in an sql query在 sql 查询中使用 DECODE 和 FIRST ORDER_BY
【发布时间】:2011-06-05 15:39:28
【问题描述】:

我已经开始学习 SQL,在浏览一些阅读材料时,我偶然发现了这个查询:

SELECT MAX(SALARY) KEEP (DENSE_RANK FIRST ORDER BY 
    DECODE (SALARY, NULL, NULL, MONTHLY_SAL) NULLS LAST)

我已经尝试阅读这意味着什么,并提出了以下内容(请原谅我冗长而无聊的解释):

  1. DECODE (SALARY, NULL, NULL, MONTHLY_SAL) NULLS LAST - 除非 SALARY 为 NULL,否则将返回 MONTHLY_SAL。 NULL 工资也将列在最后。

  2. MAX(SALARY) - 将给出由 (DENSE_RANK ...) 产生的最高工资

所以我的问题是:

  1. MAX(SALARY) 会只给出一个值吗?还是会返回整个所有行并显示最高薪水? (即,如果我有 2 行的薪水分别为 1000 和 2000,则结果将是两行的值为 2000)

  2. DENSE_RANK FIRST ORDER BY DECODE (...) 的“总”效果是什么?我只看过 ORDER BY 的例子,不确定如果与 DECODE 结合会发生什么。

谢谢

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    1) 是的,一个值

    2) 当您省略KEEP (DENSE_RANK... 时,您将获得所有 条记录的最高工资。 使用KEEP (DENSE_RANK...,您将从所有具有最小monthly_sal 和非空薪水的记录中获得最高薪水。 'DECODE' 表达式的工作是排除薪水为空的记录。

    【讨论】:

    • 嗨。谢谢回复!关于“‘DECODE’表达式的工作是排除工资为空的记录”,它是如何做到的?我的意思是,我认为空薪水仍在被返回和检查,然后检查最大值?
    • DECODE 提供 ORDER BY 的值。当 Decode 遇到 SALARY = null 的记录时,它返回 null。只有否则它会返回 MONTHLY_SAL。由于 ORDER BY 还指定 NULLS LAST(这是默认的 BTW),所以第一条记录将是 DECODE 导致的结果不为空的记录。
    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多