如何选择“超过”级别的值。分层查询

时间:2018-02-27 13:36:32

标签: sql oracle

我正在使用Oracle 11.

我喜欢将LEVEL 50中的ID值复制为LEVEL 92的新ID值。 LEVEL的52和90也在50到92之间 所以我需要“跳过”其他两个级别并从LEVEL 50中获取ID值。

我尝试了几种不同的方法来实现这一目标,但没有成功。

这是一次尝试但是当达到第92级时它没有用:

SELECT LEVEL, ID, PARENT_ID, ORGANIZATION,
       CASE WHEN LEVEL = 50 THEN DECODE(LEVEL,50,ID)
            WHEN LEVEL = 52 THEN DECODE(LEVEL,50,PARENT_ID)
            WHEN LEVEL = 90 THEN DECODE(LEVEL,50,PARENT_ID)
            WHEN LEVEL = 92 THEN DECODE(LEVEL,92,MIN(ID)
                   KEEP (DENSE_RANK FIRST ORDER PARENT_ID DESC))
       END AS NEW_VALUE
FROM A_TABLE;

帮助表示赞赏。希望你能抓住想法并给我一些建议。

非常感谢。

样本数据集和所需结果:

LEVEL   ID    PARENT_ID  ORGANIZATION NEW_VALUE
50   07615461 09479551   07537724     07615461
90   07776685 07615461   07537724     07615461
90   08195786 07615461   07537724     07615461
92   09369810 09371824   07537724     09371824 should be 07615461
92   09369828 09371824   07537724     09371824 should be 07615461
92   09369836 09371824   07537724     09371824 should be 07615461
52   09371824 07615461   07537724     07615461

目前我的查询返回LEVEL 92 ID的PARENT_ID,而不是LEVEL 50中的ID。

1 个答案:

答案 0 :(得分:0)

我无法注意到在您的查询中,只有当等级= 92时,您才能解码等级92.如果您将其更改为后面的代码,我认为您会收到所需的结果:

DECODE(LEVEL,50, ID)

修订后:

DECODE(LEVEL,92,MIN(ID)
                   KEEP (DENSE_RANK FIRST ORDER PARENT_ID DESC))

- 我认为如果用ASC替换DESC(或删除DESC),它将按要求工作。但是,如果将来ID值较低,则会指向较低的值。

我的最终提案:

SELECT LEVEL, ID, PARENT_ID, ORGANIZATION,
       CASE WHEN LEVEL = 50 THEN ID
            WHEN LEVEL = 52 THEN PARENT_ID
            WHEN LEVEL = 90 THEN PARENT_ID
            WHEN LEVEL = 92 THEN MIN(ID)
                   KEEP (DENSE_RANK FIRST ORDER PARENT_ID ASC)
       END AS NEW_VALUE
FROM A_TABLE;