Соединение влево дважды на одном столе с несколькими идентификаторами - PullRequest
0 голосов
/ 03 июля 2019

Как я могу присоединиться дважды к одной таблице и присоединить к ней 2 разных столбца из другой таблицы.

SELECT table1.id_a, table2.INFO AS Data_1, table1.id_b, table2.INFO AS Data_2
FROM table1 
LEFT OUTER JOIN table2 ON table2.id_a = table1.id_a 
LEFT OUTER JOIN table2 ON table2.id_a = table1.id_b; 

В столбце Data1 должна отображаться информация, соответствующая id_a, а в столбце Data2 должна отображаться информация, соответствующаяid_b

TABLE 1
--------
ID_A        ID_B
------------------
A           X
B           Y
C           Z

TABLE 2
--------
ID_A        INFO
-----------------
A           apple
B           pear
C           orange
Y           watermelon
X           banana
Z           blueberry




Expected output
--------------
ID_A        Data1          ID_B           Data2
-----------------------------------------------
A           apple          X               watermelon
B           pear           Y                banana
C           orange         Z                blueberry




1 Ответ

2 голосов
/ 03 июля 2019

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

SELECT t1.id_a, t2a.INFO AS Data_1, t1.id_b, t2b.INFO AS Data_2
FROM table1 t1
LEFT OUTER JOIN table2 t2a ON t2a.id_a = t1.id_a 
LEFT OUTER JOIN table2 t2b ON t2b.id_a = t1.id_b;

РЕДАКТИРОВАТЬ: для полной демонстрации:

with tab1 as (
    select 'A' id_a, 'X' id_b from dual
    union all
    select 'B' id_a, 'Y' id_b from dual
    union all
    select 'C' id_a, 'Z' id_b from dual)
  , tab2 as (
     SELECT 'A' id_a, 'apple' info from dual
    union all
     SELECT 'B' id_a, 'pear' info from dual
    union all
     SELECT 'C' id_a, 'orange' info from dual
    union all
     SELECT 'X' id_a, 'watermelon' info from dual
    union all
     SELECT 'Y' id_a, 'banana' info from dual
    union all
     SELECT 'Z' id_a, 'blueberry' info from dual
    )    
select  t1.id_a, t2.info, t1.id_b, t3.info
from   tab1 t1
left outer join tab2 t2 on t2.id_a = t1.id_a
left outer join tab2 t3 on t3.id_a = t1.id_b;

ID_A INFO  ID_B   INFO_1
A    apple    X   watermelon
B    pear     Y   banana
C    orange   Z   blueberry
...