获取特定条件的父值-Oracle SQL
我有一张桌子: 表1获取特定条件的父值-Oracle SQL,sql,oracle,Sql,Oracle,我有一张桌子: 表1 id e_id e_value line_num 64 HI02-01 ABF 32 64 HI02-02 E039 32 64 HI03-01 XYZ 32 64 HI03-02 E039 32 64 AI05-01 XYZ 32 64 AI05-02 E039 32 67 HI02-01
id e_id e_value line_num
64 HI02-01 ABF 32
64 HI02-02 E039 32
64 HI03-01 XYZ 32
64 HI03-02 E039 32
64 AI05-01 XYZ 32
64 AI05-02 E039 32
67 HI02-01 ABC 28
67 HI02-02 R590 28
67 HI03-01 WQE 28
仅对于e_id,如'HI%'对于每个id,line_num,我需要获取第一个'-01'值作为父项
例如
- HI02-01是HI02-02、HI02-03、HI02-04的父级
- HI03-01是HI03-02、HI03-03、HI03-04的父级
id e_id e_value line_num parent_e_id parent_e_value
64 HI02-01 ABF 32 HI02-01 ABF
64 HI02-02 E039 32 HI02-01 ABF
64 HI03-01 XYZ 32 HI03-01 XYZ
64 HI03-02 E039 32 HI03-01 XYZ
64 AI05-01 XYZ 32
64 AI05-02 E039 32
67 HI02-01 ABC 28 HI02-01 ABC
67 HI02-02 R590 28 HI02-01 ABC
67 HI03-01 WQE 28 HI03-01 WQE
如何在Oracle sql中实现这一点?根据您需要的条件使用自连接:
select t.*,
tt.e_id parent_e_id, tt.e_value parent_e_value
from tablename t left join tablename tt
on tt.id = t.id and tt.line_num = t.line_num
and t.e_id like 'HI%' and tt.e_id like 'HI%'
and (tt.e_id = coalesce((
select max(e_id) from tablename
where id = t.id and line_num = t.line_num and e_id < t.e_id
and substr(e_id, 1, 4) = substr(t.e_id, 1, 4)
), t.e_id)
)
在您需要的条件下使用自连接:
select t.*,
tt.e_id parent_e_id, tt.e_value parent_e_value
from tablename t left join tablename tt
on tt.id = t.id and tt.line_num = t.line_num
and t.e_id like 'HI%' and tt.e_id like 'HI%'
and (tt.e_id = coalesce((
select max(e_id) from tablename
where id = t.id and line_num = t.line_num and e_id < t.e_id
and substr(e_id, 1, 4) = substr(t.e_id, 1, 4)
), t.e_id)
)
假设您只想选择父值,这里有一种方法:
WITH table1 AS (SELECT 64 ID, 'HI02-01' e_id, 'ABF' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'HI02-02' e_id, 'E039' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'HI03-01' e_id, 'XYZ' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'HI03-02' e_id, 'E039' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'AI05-01' e_id, 'XYZ' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'AI05-02' e_id, 'E039' e_value, 32 line_num FROM dual UNION ALL
SELECT 67 ID, 'HI02-01' e_id, 'ABC' e_value, 28 line_num FROM dual UNION ALL
SELECT 67 ID, 'HI02-02' e_id, 'R590' e_value, 28 line_num FROM dual UNION ALL
SELECT 67 ID, 'HI03-01' e_id, 'WQE' e_value, 28 line_num FROM dual)
SELECT ID,
e_id,
e_value,
line_num,
CASE WHEN e_id LIKE 'HI%' THEN first_value(e_id) OVER (PARTITION BY ID, line_num, CASE WHEN e_id LIKE 'HI%' THEN SUBSTR(e_id, 1, 4) END ORDER BY e_id) END parent_e_id,
CASE WHEN e_id LIKE 'HI%' THEN first_value(e_value) OVER (PARTITION BY ID, line_num, CASE WHEN e_id LIKE 'HI%' THEN SUBSTR(e_id, 1, 4) END ORDER BY e_id) END parent_e_value
FROM table1;
ID E_ID E_VALUE LINE_NUM PARENT_E_ID PARENT_E_VALUE
---------- ------- ------- ---------- ----------- --------------
64 HI02-01 ABF 32 HI02-01 ABF
64 HI02-02 E039 32 HI02-01 ABF
64 HI03-01 XYZ 32 HI03-01 XYZ
64 HI03-02 E039 32 HI03-01 XYZ
64 AI05-01 XYZ 32
64 AI05-02 E039 32
67 HI02-01 ABC 28 HI02-01 ABC
67 HI02-02 R590 28 HI02-01 ABC
67 HI03-01 WQE 28 HI03-01 WQE
这将使用
first_value
分析函数输出每组中的第一个值,但仅当e_id以HI开头时。我假设所有HI%e_ID都是相同的XXNN-NN格式。假设您只想选择父值,这里有一种方法:
WITH table1 AS (SELECT 64 ID, 'HI02-01' e_id, 'ABF' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'HI02-02' e_id, 'E039' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'HI03-01' e_id, 'XYZ' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'HI03-02' e_id, 'E039' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'AI05-01' e_id, 'XYZ' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'AI05-02' e_id, 'E039' e_value, 32 line_num FROM dual UNION ALL
SELECT 67 ID, 'HI02-01' e_id, 'ABC' e_value, 28 line_num FROM dual UNION ALL
SELECT 67 ID, 'HI02-02' e_id, 'R590' e_value, 28 line_num FROM dual UNION ALL
SELECT 67 ID, 'HI03-01' e_id, 'WQE' e_value, 28 line_num FROM dual)
SELECT ID,
e_id,
e_value,
line_num,
CASE WHEN e_id LIKE 'HI%' THEN first_value(e_id) OVER (PARTITION BY ID, line_num, CASE WHEN e_id LIKE 'HI%' THEN SUBSTR(e_id, 1, 4) END ORDER BY e_id) END parent_e_id,
CASE WHEN e_id LIKE 'HI%' THEN first_value(e_value) OVER (PARTITION BY ID, line_num, CASE WHEN e_id LIKE 'HI%' THEN SUBSTR(e_id, 1, 4) END ORDER BY e_id) END parent_e_value
FROM table1;
ID E_ID E_VALUE LINE_NUM PARENT_E_ID PARENT_E_VALUE
---------- ------- ------- ---------- ----------- --------------
64 HI02-01 ABF 32 HI02-01 ABF
64 HI02-02 E039 32 HI02-01 ABF
64 HI03-01 XYZ 32 HI03-01 XYZ
64 HI03-02 E039 32 HI03-01 XYZ
64 AI05-01 XYZ 32
64 AI05-02 E039 32
67 HI02-01 ABC 28 HI02-01 ABC
67 HI02-02 R590 28 HI02-01 ABC
67 HI03-01 WQE 28 HI03-01 WQE
这将使用
first_value
分析函数输出每组中的第一个值,但仅当e_id以HI开头时。我假设所有HI%e\u id都是相同的XXNN-NN格式。我认为最后一行违反了规则,因为id,line\u num
组合与前两行相同,而它们的父\u e\u id
值是HI02-01
我需要父值HI0%-01。例如,如果在id中的第_num行中,我有HI02-01和HI02-02,则双亲都是HI02-01。在同一个id中,行号,如果我有HI03-01,HI03-02,那么这些的父项应该是HI03-01基本上总是在同一个id中获取HI0(*)01,行号更新表中的值以使其更有意义。我认为最后一行违反了规则,因为id,行数
组合与前两行相同,而它们的父行id
值为HI02-01
我需要HI0%-01的父行值。例如,如果在id中的第_num行中,我有HI02-01和HI02-02,则双亲都是HI02-01。在同一个id中,行号,如果我有HI03-01,HI03-02,那么这些的父项应该是HI03-01基本上总是在同一个id中获取HI0(*)-01,行号更新表中的值以使其更有意义。当我执行创建查询时,它会给出一个错误-ORA-01799:当我执行创建查询时,列可能没有外部连接到子查询,它给出了一个错误-ORA-01799:列可能没有外部联接到子查询