Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
对嵌套SQL语句中的DB项进行排序_Sql_Oracle - Fatal编程技术网

对嵌套SQL语句中的DB项进行排序

对嵌套SQL语句中的DB项进行排序,sql,oracle,Sql,Oracle,我有个问题,我不能四处走动。通过下面的脚本,我根据一些标准得到了一些副本。我想根据具体情况对它们进行分类 O.SL_OBJ_LAST_更改了日期,并且只为每个源io获取最早的日期 select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io from SL_PP01_FAQ01 F, SL_PP01_TRANS_META TM, SL_PP01_OBJ O, (select source_io, lang

我有个问题,我不能四处走动。通过下面的脚本,我根据一些标准得到了一些副本。我想根据具体情况对它们进行分类 O.SL_OBJ_LAST_更改了日期,并且只为每个源io获取最早的日期

select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
from SL_PP01_FAQ01 F,
     SL_PP01_TRANS_META TM,
     SL_PP01_OBJ O,
     (select source_io, lang
      from SL_PP01_TRANS_META M,
           sl_pp01_obj obj
      where lang <> 'de'
        and M.sl_obj_id = obj.sl_obj_id
        and obj.sl_obj_deleted_flag = 0
      group by source_io, lang
      having count(M.sl_obj_id) > 1) D
WHERE TM.source_io = D.source_io
  AND TM.lang = D.lang
  AND TM.sl_obj_id = F.sl_obj_id
  AND TM.sl_obj_id = O.sl_obj_id
  and O.sl_obj_deleted_flag = 0
order by TM.source_io;
我希望的输出仅为每个源io的较旧日期:

sl_obj_id || sl_obj_last_changed_date || source_io
255018    || 25.01.2017               || 123456
568631    || 10.08.2014               || 789012
424524    || 05.05.2016               || 135791
有人知道如何实现这一点吗?

您可以尝试使用行数窗口功能来实现

SELECT t1.* FROM (
    SELECT t.*,ROW_NUMBER() OVER(PARTITION  BY source_io ORDER BY sl_obj_last_changed_date ) rn
    FROM youtable t
) t1
where rn = 1
这是完整的代码

我会使用JOIN而不是连接表,您可以尝试使用CTE让代码更清晰

with CTE AS (
    select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
    from SL_PP01_FAQ01 F 
    JOIN SL_PP01_TRANS_META TM ON TM.sl_obj_id = F.sl_obj_id
    JOIN SL_PP01_OBJ O ON TM.sl_obj_id = O.sl_obj_id
    JOIN (select source_io, lang
          from SL_PP01_TRANS_META M,
               sl_pp01_obj obj
          where lang <> 'de'
            and M.sl_obj_id = obj.sl_obj_id
            and obj.sl_obj_deleted_flag = 0
          group by source_io, lang
          having count(M.sl_obj_id) > 1) D ON TM.lang = D.lang
    WHERE TM.source_io = D.source_io
      and O.sl_obj_deleted_flag = 0
    order by TM.source_io
)

SELECT t1.* FROM (
    SELECT t1.*,ROW_NUMBER() OVER(PARTITION  BY source_io ORDER BY sl_obj_last_changed_date ) rn
    FROM CTE t1
) t1
where rn = 1
您可以尝试使用Row_number窗口函数来实现它

SELECT t1.* FROM (
    SELECT t.*,ROW_NUMBER() OVER(PARTITION  BY source_io ORDER BY sl_obj_last_changed_date ) rn
    FROM youtable t
) t1
where rn = 1
这是完整的代码

我会使用JOIN而不是连接表,您可以尝试使用CTE让代码更清晰

with CTE AS (
    select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
    from SL_PP01_FAQ01 F 
    JOIN SL_PP01_TRANS_META TM ON TM.sl_obj_id = F.sl_obj_id
    JOIN SL_PP01_OBJ O ON TM.sl_obj_id = O.sl_obj_id
    JOIN (select source_io, lang
          from SL_PP01_TRANS_META M,
               sl_pp01_obj obj
          where lang <> 'de'
            and M.sl_obj_id = obj.sl_obj_id
            and obj.sl_obj_deleted_flag = 0
          group by source_io, lang
          having count(M.sl_obj_id) > 1) D ON TM.lang = D.lang
    WHERE TM.source_io = D.source_io
      and O.sl_obj_deleted_flag = 0
    order by TM.source_io
)

SELECT t1.* FROM (
    SELECT t1.*,ROW_NUMBER() OVER(PARTITION  BY source_io ORDER BY sl_obj_last_changed_date ) rn
    FROM CTE t1
) t1
where rn = 1

使用行数函数:

with cte1 (sl_obj_id, sl_obj_last_changed_date,source_io) as
(
select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
from SL_PP01_FAQ01 F,
     SL_PP01_TRANS_META TM,
     SL_PP01_OBJ O,
     (select source_io, lang
      from SL_PP01_TRANS_META M,
           sl_pp01_obj obj
      where lang <> 'de'
        and M.sl_obj_id = obj.sl_obj_id
        and obj.sl_obj_deleted_flag = 0
      group by source_io, lang
      having count(M.sl_obj_id) > 1) D
WHERE TM.source_io = D.source_io
  AND TM.lang = D.lang
  AND TM.sl_obj_id = F.sl_obj_id
  AND TM.sl_obj_id = O.sl_obj_id
  and O.sl_obj_deleted_flag = 0
order by TM.source_io;
)

select * from 
(
select sl_obj_id, sl_obj_last_changed_date,source_io, row_number() over(partition by source_io order by sl_obj_last_changed_date) as rn from cte1) a where rn=1

使用行数函数:

with cte1 (sl_obj_id, sl_obj_last_changed_date,source_io) as
(
select O.sl_obj_id, O.SL_OBJ_LAST_CHANGED_DATE, tm.source_io
from SL_PP01_FAQ01 F,
     SL_PP01_TRANS_META TM,
     SL_PP01_OBJ O,
     (select source_io, lang
      from SL_PP01_TRANS_META M,
           sl_pp01_obj obj
      where lang <> 'de'
        and M.sl_obj_id = obj.sl_obj_id
        and obj.sl_obj_deleted_flag = 0
      group by source_io, lang
      having count(M.sl_obj_id) > 1) D
WHERE TM.source_io = D.source_io
  AND TM.lang = D.lang
  AND TM.sl_obj_id = F.sl_obj_id
  AND TM.sl_obj_id = O.sl_obj_id
  and O.sl_obj_deleted_flag = 0
order by TM.source_io;
)

select * from 
(
select sl_obj_id, sl_obj_last_changed_date,source_io, row_number() over(partition by source_io order by sl_obj_last_changed_date) as rn from cte1) a where rn=1

今天的提示:切换到现代的显式连接语法!更容易编写而不出错,更容易阅读和维护,并且在需要时更容易转换为外部联接。今天的提示:切换到现代的显式联接语法!更易于编写而无错误,更易于读取和维护,并且在需要时更易于转换为外部联接。