如何从最终表中的嵌套SELECT查询返回列?

时间:2020-05-04 10:00:21

标签: sql join hana

我有三层有效的嵌套查询。

select PARTNER, BIRTHDT, XSEXM, XSEXF from "schema"."platform.view/table2" where partner IN 
(select SID from "schema"."platform.view/table1" where TYPE='BB' and CLASS='yy' and ID IN 
(select SID from "schema"."platform.view/table1" where TYPE='AA' and CLASS='zz' and ID IN ("one", "two")
))

我希望最里面的查询中的table1中的值(“一个”,“两个”)出现在返回的最终表中。

我试图这样获得它:

select t1.ID, t2.SID from "schema"."platform.view/table1" t1
OUTER APPLY (
select SID from "schema"."platform.view/table1" t2
where t2.TYPE='BB' and t2.CLASS='yy' and t2.ID IN t1.SID
)
where t1.TYPE='AA' and t1.CLASS='zz' and t1.ID IN ("one", "two")

共有三个标识符: 1. ID(一个,两个等) 2.中间SID(123、124等),再次被搜索为ID 3.映射到表2的伙伴ID(P12,P13等)。

样本数据:

表1:

| ID   | SID | TYPE | CLASS |
|------|-----|------|-------|
| ONE  | 123 | AA   | zz    |
| TWO  | 124 | AA   | zz    |
| 123  | P12 | BB   | yy    |
| THRE | 125 | AA   | zz    |
| 124  | P13 | BB   | yy    |
| 125  | P14 | BB   | yy    |
| FOUR | 123 | AA   | zz    |

表2:

| PARTNER | BIRTHDT  | XSEXM | XSEXF |
|---------|----------|-------|-------|
| P12     | 19900214 | X     |       |
| P13     | 19900713 | X     |       |
| P14     | 19900407 |       | X     |

输入("ONE", "TWO", "THRE")的所需输出:

| ID  | PARTNER | BIRTHDT  | XSEXM | XSEXF |
|-----|---------|----------|-------|-------|
| ONE | P12     | 19900214 | X     |       |
| TWO | P13     | 19900713 | X     |       |
| THRE| P14     | 19900407 |       | X     |

如何在此三层嵌套语句中将此初始搜索值与其最终结果行对应起来?

1 个答案:

答案 0 :(得分:0)

由于您想从“内部” SELECT中“携带”信息,因此您可以在最后的投影步骤中“合并”数据,这需要您具有1:1的关系才能使用加入。

这里不是这种情况。

相反,请勿使用WHERE ... IN (SELECT ID...)方法,而应使用INNER JOIN。 这些允许进行相同类型的筛选/选择,但也提供了对两个相关表的任何列进行投影的选项。

对于您的相当抽象的语句(列名确实需要大量上下文知识才能理解...-您可能需要通过添加有用的列别名来进行修复),如下所示:

drop table tab1;
drop table tab2;

CREATE TABLE TAB1
    ("ID" varchar(6)
    , "SID" varchar(5)
    , "TYPE" varchar(6)
    , "CLASS" varchar(7))
;


 INSERT   INTO TAB1 
         VALUES ('ONE', '123', 'AA', 'zz');
 INSERT   INTO TAB1  
         VALUES ('TWO', '124', 'AA', 'zz');
 INSERT   INTO TAB1  
         VALUES ('123', 'P12', 'BB', 'yy');
 INSERT   INTO TAB1 
         VALUES ('THRE', '125', 'AA', 'zz');
 INSERT   INTO TAB1 
         VALUES ('124', 'P13', 'BB', 'yy');
 INSERT   INTO TAB1  
         VALUES ('125', 'P14', 'BB', 'yy');
  INSERT  INTO TAB1  
         VALUES ('FOUR', '123', 'AA', 'zz');


 select * from tab1;
 CREATE TABLE TAB2
    ("PARTNER" varchar(9)
    , "BIRTHDT" varchar(10)
    , "XSEXM" varchar(7)
    , "XSEXF" varchar(7))
;

INSERT    INTO TAB2
         VALUES ('P12', '19900214', 'X', NULL);
INSERT    INTO TAB2
         VALUES ('P13', '19900713', 'X', NULL);
INSERT    INTO TAB2
         VALUES ('P14', '19900407', NULL, 'X');
with id_sel as (
    select SID, ID 
      from TAB1 
      where 
            TYPE='AA' 
        and CLASS='zz' 
        and ID IN ('ONE', 'TWO', 'THRE')
),
part_sel as (
    select 
        t1.SID, id.ID orig_id 
    from 
        TAB1 t1
        inner join id_sel id
            on t1.id = id.sid

    where 
             t1.TYPE='BB' 
        and  t1.CLASS='yy' 

)           
select 
        part_sel.orig_id, t2.PARTNER, t2.BIRTHDT, t2.XSEXM, t2.XSEXF 
from 
    TAB2 t2
    inner join part_sel
     on t2.partner = part_sel.sid;



ORIG_ID PARTNER BIRTHDT     XSEXM   XSEXF
ONE     P12     19900214    X       ?    
TWO     P13     19900713    X       ?    
THRE    P14     19900407    ?       X    
相关问题