我想列出表中单个代码列的父级和子级数据,其中包含同一列中的父级和子级:
代码 | 描述 | |
---|---|---|
4000 | 农业 | 家长 |
4010 | 农作物生产 | 孩子 |
4011 | 渔业 | 孩子 |
4100 | 采矿和采石业 | 家长 |
4110 | 非金属采石 | 孩子 |
4111 | 其他 | 孩子 |
结果应该是这样的:
代码 | 描述 | 结果栏1 | 结果栏2 |
---|---|---|---|
4000 | 农业 | 农业 | |
4010 | 农作物生产 | 农作物生产 | |
4011 | 渔业 | 渔业 | |
4100 | 采矿和采石业 | 采矿和采石业 | |
4110 | 非金属采石 | 非金属采石 | |
4111 | 其他 | 其他 |
我需要一个 Oracle SQL 语句来仅列出一列中的父级和另一列中的相应子级。
假设您的父母有一个以
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 | 其他 | 空 | 其他 |