我正在使用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。
答案 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;