将Oracle转换为配置单元-子查询在选择列表中只能包含1个项目

inkz8wg9  于 2022-09-20  发布在  Oracle
关注(0)|答案(3)|浏览(148)

要在您的系统上试用的代码和示例数据:

CREATE TABLE "EMP" 
   (    "DR_SID" NUMBER, 
    "DR_NAME" VARCHAR2(50 BYTE) COLLATE "USING_NLS_COMP", 
    "ACTIVE_FLAG" VARCHAR2(1 BYTE) COLLATE "USING_NLS_COMP", 
    "LAST_UPDATED_TIME" TIMESTAMP (6), 
    "DATA_SOURCE" VARCHAR2(100 BYTE) COLLATE "USING_NLS_COMP", 
    "ROW_LIMIT" VARCHAR2(50 BYTE) COLLATE "USING_NLS_COMP", 
    "VERSION#" NUMBER, 
    "PARENT_DR_SID" NUMBER
   ) 
   ;

REM INSERTING into EMP
SET DEFINE OFF;
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (1,'this should not come1',to_timestamp('18-APR-20 05.05.52.425734000 AM','DD-MON-RR HH.MI.SSXFF AM'),1,1);
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (2,'come',to_timestamp('19-SEP-20 07.18.56.271199000 AM','DD-MON-RR HH.MI.SSXFF AM'),1,2);
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (3,'come123',to_timestamp('13-FEB-21 05.05.51.645956000 AM','DD-MON-RR HH.MI.SSXFF AM'),1,3);
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (4,'come456',to_timestamp('13-FEB-21 05.05.51.951505000 AM','DD-MON-RR HH.MI.SSXFF AM'),1,4);
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (5,'this should not come2',to_timestamp('18-APR-20 05.05.52.425734000 AM','DD-MON-RR HH.MI.SSXFF AM'),2,1);
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (6,'this should COME',to_timestamp('18-APR-20 05.05.52.425734000 AM','DD-MON-RR HH.MI.SSXFF AM'),3,1);

SELECT DR_SID, DR_NAME, LAST_UPDATED_TIME, VERSION#, PARENT_DR_SID FROM emp ;

下面的查询需要转换为配置单元,有人能帮忙吗?

SELECT DR_SID, DR_NAME, LAST_UPDATED_TIME, VERSION#, PARENT_DR_SID FROM emp t
where (version#,parent_dr_sid)
in (select max(version#),parent_dr_sid from emp group by parent_dr_sid)
;

我试图找出哪条记录是最新的,所以我使用Version#列(如果Version#列有最大值,则该记录是最新的,其以前的记录是旧的,不显示)。

现在看看记录是如何相互链接的,所以我们有两列,dr_sid is pkparent_dr_sid包含相同的值,以表明此记录与哪个旧记录链接。

您可以在这里看到示例,在给定的示例代码中,dr_sid = 1在parent_dr_sid中出现了3次,parent_dr_sid的这3条记录的值都与1相同(链接到dr_sid)。

现在我想要下面的O/P,你们能在Hive里做同样的事情吗?

仅供参考-我们无法更新表,因此尝试以这种方式更新记录并以这种方式获取。

DR_SID, DR_NAME, LAST_UPDATED_TIME, VERSION#, PARENT_DR_SID
1   this should not come1   18-APR-20 05.05.52.425734000 AM 1   1
2   come    19-SEP-20 07.18.56.271199000 AM 1   2
3   come123 13-FEB-21 05.05.51.645956000 AM 1   3
4   come456 13-FEB-21 05.05.51.951505000 AM 1   4
5   this should not come2   18-APR-20 05.05.52.425734000 AM 2   1
6   this should COME    18-APR-20 05.05.52.425734000 AM 3   1
mqxuamgl

mqxuamgl1#

使用left semi join模拟元组的in语义。

with input as (
  select inline(array(
    (1,1),
    (1,2),
    (2,1),
    (2, 2)
  )) as (c1, c2)
)
, flt as (
  select inline(array(
    (1,1),
    (2, 2)
  )) as (f1, f2)
)
select *, split(version(), ' ')[0] as v
from input
  left semi join flt
  on input.c1 = flt.f1
  and input.c2 = flt.f2

Input.c1|input.c2|v
-|-|
1|1|3.1.3000.7.1.7.0-551
2|2|3.1.3000.7.1.7.0-551

ebdffaop

ebdffaop2#

我不知道Hive,所以这些可能是完全无用的建议;然而,看看它是否有帮助。

如果可以在FROM子句中使用子查询,则可以执行以下操作:

select e.*
from emp e join (select max(a.create_tm) create_tm, a.open_dt
                 from emp a group by a.open_dt
                ) x
             on x.create_tm = e.create_tm 
            and x.open_dt = e.open_dt;

或者,通过串联值使子查询返回单个列。它们*看起来像“time”和“date”(我不知道它们的数据类型,所以您可能需要对这些列应用例如TO_CHAR函数;只要它返回所需的结果,就没有问题):

select *
from emp
where concat(create_tm, open_dt) in (select concat(max(create_tm), open_dt)
                                     from emp
                                     group by open_dt);
643ylb08

643ylb083#

这是奏效的:

SELECT DR_SID, DR_NAME, LAST_UPDATED_TIME, VERSION#--, PARENT_DR_SID 
FROM emp t join 
(select max(version#) v,parent_dr_sid from emp group by parent_dr_sid) t2
on t.version#=t2.v and t.parent_dr_sid = t2.parent_dr_sid
;

相关问题