2017-02-14 5 views
0

Приведенные таблицы 1 и Таблица 2, как показано ниже, как вернуть результаты, показанные ниже?Как присоединиться к родительским и дочерним таблицам, чтобы получить следующее с помощью SQL или HQL

TABLE1

TBL1_PK  TBL1_COL2 
1   A 

TABLE2

TBL2_PK TABLE1_FK ROLE_CD   FIRST_NAME LAST_NAME 
1  1   ROLE_1  DEF GHI 
2  1   ROLE_2  JKL MNP 
3  1   ROLE_3  RST UVW 

RESULSET

TBL1_COL2 ROLE_1_FIRST_NAME ROLE1_LAST_NAME ROLE_2_FIRST_NAME ROLE_2_LAST_NAME 
A   DEF    GHI    JKL    MNP 

ответ

0

Соедините таблицу 1 с таблицей 2 дважды с двумя разными псевдонимами. Затем ограничьте псевдонимы по мере необходимости, чтобы получить role_1 от одного и role_2 от другого

select 
T1.TBL1_COL2 as "TBL1_COL2", 
T2R1.FIRST_NAME as "Role_1_first_name", 
T2R1.Last_name as "Role_1_last_name", 
T2R2.First_name as "Role_2_first_name", 
T2R2.Last_name as "Role_2_last_name" 
from 
    Table1 as T1 
inner join Table2 as T2R1 on T1.TBL1_PK = T2R1.Table1_fk 
inner join Table2 as T2R2 on T2.TBL1_PK = T2T2.Table1_fk 
where 
    T2R1.role_cd = "Role_1" 
and T2T2.role_cd = "Role_2"; 
+0

Подход Майка работал для меня. Всем спасибо. выберите T1.TBL1_COL2 как "TBL1_COL2", T2R1.FIRST_NAME как "ROLE_1_FIRST_NAME" T2R1.LAST_NAME как "ROLE_1_LAST_NAME", T2R2.FIRST_NAME как "ROLE_2_FIRST_NAME", T2R2.LAST_NAME как "ROLE_2_LAST_NAME" от Table1 как T1 внутреннее соединение Table2 в T2R1 на T1.TBL1_PK = T2R1.TABLE1_FK внутреннее соединение Table2 в T2R2 на T1.TBL1_PK = T2T2.TABLE1_FK где T2R1.role_cd = 'ROLE_1' и T2R2.role_cd = 'ROLE_2' –

+0

Это неэффективный подход. Вторая таблица читается дважды. Вам не нужно читать дважды – GurV

+0

Эффективность зависит от многих факторов. Любой оптимизатор будет читать таблицу с диска только один раз. Если вся таблица кэшируется в памяти, может вообще не читаться диск. После этого возникает вопрос, будет ли 4 оператора case и агрегация быстрее, чем дополнительный поиск первичного ключа и 2 сравнения равенства. Я буду держать пари, как обычно, ответ «это зависит». Если это критически важный запрос, когда время и процессор важны, я бы предложил проверить оба. Если нет, я предлагаю работать в зависимости от того, что легче понять и сохранить. –

0

Вы можете использовать агрегацию, чтобы сделать это:

select t1.TBL1_COL2, 
    max(case 
      when t2.role_cd = 'ROLE_1' 
       then t2.first_name 
      end) ROLE_1_FIRST_NAME, 
    max(case 
      when t2.role_cd = 'ROLE_1' 
       then t2.last_name 
      end) ROLE1_LAST_NAME, 
    max(case 
      when t2.role_cd = 'ROLE_2' 
       then t2.first_name 
      end) ROLE_2_FIRST_NAME, 
    max(case 
      when t2.role_cd = 'ROLE_2' 
       then t2.last_name 
      end) ROLE2_LAST_NAME 
from table1 t1 
join table2 t2 on t1.tbl1_pk = t2.table1_fk 
group by t1.TBL1_COL2