Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取特定条件的父值-Oracle SQL_Sql_Oracle - Fatal编程技术网

获取特定条件的父值-Oracle SQL

获取特定条件的父值-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

我有一张桌子:

表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     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:列可能没有外部联接到子查询