Oracle SQL 中的父查询列表

问题描述 投票:0回答:1

我想列出表中单个代码列的父级和子级数据,其中包含同一列中的父级和子级:

代码 描述
4000 农业 家长
4010 农作物生产 孩子
4011 渔业 孩子
4100 采矿和采石业 家长
4110 非金属采石 孩子
4111 其他 孩子

结果应该是这样的:

代码 描述 结果栏1 结果栏2
4000 农业 农业
4010 农作物生产 农作物生产
4011 渔业 渔业
4100 采矿和采石业 采矿和采石业
4110 非金属采石 非金属采石
4111 其他 其他

我需要一个 Oracle SQL 语句来仅列出一列中的父级和另一列中的相应子级。

sql oracle
1个回答
0
投票

假设您的父母有一个以

code
结尾的
00
,并且孩子有一个不以
00
结尾且与父母具有相同前导数字的代码,那么您可以使用分层查询:

SELECT code,
       description,
       CASE LEVEL WHEN 1 THEN description END AS result_column1,
       CASE LEVEL WHEN 2 THEN description END AS result_column2
FROM   table_name
WHERE  LEVEL <= 2
START WITH MOD(code, 100) = 0
CONNECT BY TRUNC(PRIOR code / 100) = TRUNC(code / 100)
AND        PRIOR code < code
ORDER SIBLINGS BY code

但是你也许可以将其简化为:

SELECT code,
       description,
       CASE WHEN code LIKE '%00' THEN description END AS result_column1,
       CASE WHEN code NOT LIKE '%00' THEN description END AS result_column2
FROM   table_name
ORDER BY code;

对于样本数据:

CREATE TABLE table_name (Code, Description) AS
SELECT 4000, 'Agriculture'         FROM DUAL UNION ALL
SELECT 4010, 'Crops Production'    FROM DUAL UNION ALL
SELECT 4011, 'Fishery'             FROM DUAL UNION ALL
SELECT 4100, 'Mining and Quarying' FROM DUAL UNION ALL
SELECT 4110, 'Non Metal Quarying'  FROM DUAL UNION ALL
SELECT 4111, 'Others'              FROM DUAL;

两个输出:

代码 描述 RESULT_COLUMN1 RESULT_COLUMN2
4000 农业 农业
4010 农作物生产 农作物生产
4011 渔业 渔业
4100 采矿和采石 采矿和采石
4110 非金属采石 非金属采石
4111 其他 其他

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.