Как вернуть столбцы из вложенных запросов SELECT в итоговой таблице? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть трехслойный вложенный запрос, который работает.

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, et c.) 2. промежуточный SID (123, 124, et c), который снова ищется как ID 3. Идентификатор партнера (P12, P13, et c), который сопоставляется с таблицей2.

Пример данных:

table1:

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

table2:

| 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 голосов
/ 05 мая 2020

Поскольку вы хотите "переносить" информацию из ваших "внутренних" SELECT s, вы можете либо "объединить" данные на последнем шаге проецирования, что требует наличия отношения 1: 1, которое вы могли бы использовать для join.

Это не тот случай.

Вместо этого не используйте подход WHERE ... IN (SELECT ID...), а вместо этого INNER JOIN s. Они допускают такой же тип фильтрации / выбора, но также дают возможность проецировать любой столбец двух задействованных таблиц.

Для вашего довольно абстрактного утверждения (имена столбцов действительно нуждаются в большом знании контекста, чтобы смысл ... - это то, что вы можете исправить, добавив полезные псевдонимы столбцов) это может выглядеть так:

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