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

问题描述 投票:0回答:1

我有三层嵌套查询,它的工作。

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")
))

我希望在最里面的查询中,表1中的值("一","二")能在最后返回的表中出现。

我试着让它像这样。

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 ( ONE,TWO等)2.中间的SID( 123,124等),这又被搜索为ID3。伙伴ID( P12,P13等),它映射到table2。

样本数据。

表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     |

在这三层嵌套语句中,如何将这个初始搜索值与其最终结果行进行映射?

sql join hana
1个回答
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    
© www.soinside.com 2019 - 2024. All rights reserved.