Объединение двух таблиц с разными значениями в одном столбце - PullRequest
0 голосов
/ 01 мая 2018

Я не эксперт в sql. У меня есть некоторые данные, как показано ниже:

select column1,column2,cloumn3 from table1;

----------------------------------------------

sub1  2207   43
sub2  2207   45
sub3  2207   47

select column1,column2,cloumn3,attribute_name,attribute_value from table2;
--------------------------------------------------------------------------

sub1  2207   43  ENTITY_ID          VIJAY
sub2  2207   45  ENTITY_ID          SHANKAR
sub2  2207   45  ACTIVATION_DATE    01052018
sub3  2207   47  ENTITY_ID          RISHI
sub3  2207   47  ACTIVATION_DATE    01042018

Мне нужен вывод вроде:

sub1  2207   43   VIJAY       NULL   
sub2  2207   45   SHANKAR     01052018
sub3  2207   47   RISHI       01042018

И мне кажется, это тяжело. Может ли кто-нибудь помочь мне найти запрос.

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Один из вариантов - сделать что-то подобное с подзапросами:

select column1,column2,cloumn3
 , (
   select attribute_value
   from table2 b
   where attribute_name = 'ENTITY_ID'
     and a.column1 = b.column1
     and a.column2 = b.column2
     and a.column3 = b.column3
 )
 , (
   select attribute_value
   from table2 b
   where attribute_name = 'ACTIVATION_DATE'
     and a.column1 = b.column1
     and a.column2 = b.column2
     and a.column3 = b.column3
 )
from table1 a;

Другой вариант, более симпатичный и, возможно, с более высокой производительностью, в зависимости от механизма БД, заключался бы в использовании оси второй таблицы, а затем в соединении с первой. Но я позволю вам расследовать это, если вам интересно.

0 голосов
/ 01 мая 2018

Вы можете использовать оператор PIVOT - и только table2 абсолютно необходим:

SELECT * FROM (
    SELECT column1, column2, column3, ..., attribute_name, attribute_value
      FROM table2
) PIVOT (
    MAX(attribute_value)
    FOR attribute_name IN ('ENTITY_ID' AS entity_id, 'ACTIVATION_DATE' AS activation_date)
)
 ORDER BY column1;

См. Рабочую скрипту SQL здесь .

Обратите внимание, что MAX() в PIVOT существует только потому, что PIVOT ожидает агрегатную функцию. MIN() будет работать так же хорошо (есть только одно значение).

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Только что увидел ваш комментарий о многих других столбцах в table1, что вам нужно. В этом случае вам понадобится что-то вроде следующего:

SELECT * FROM (
    SELECT t1.column1, t1.column2, t1.column3, ..., t2.attribute_name, t2.attribute_value
      FROM table1 t1 INNER JOIN table2 t2
        ON t1.column1 = t2.column1
       AND t1.column2 = t2.column2
       AND t1.column3 = t2.column3
) PIVOT (
    MAX(attribute_value)
    FOR attribute_name IN ('ENTITY_ID' AS entity_id, 'ACTIVATION_DATE' AS activation_date)
)
 ORDER BY column1;

РЕДАКТИРОВАТЬ # 2: Если вам нужно преобразовать ACTIVATION_DATE в фактическую дату, вы можете сделать что-то вроде следующего:

SELECT column1, column2, column3, ..., entity_id
     , TO_DATE(activation_date, 'ddmmyyyy') AS activation_date
  FROM (
    SELECT t1.column1, t1.column2, t1.column3, ..., t2.attribute_name, t2.attribute_value
      FROM table1 t1 INNER JOIN table2 t2
        ON t1.column1 = t2.column1
       AND t1.column2 = t2.column2
       AND t1.column3 = t2.column3
) PIVOT (
    MAX(attribute_value)
    FOR attribute_name IN ('ENTITY_ID' AS entity_id, 'ACTIVATION_DATE' AS activation_date)
)
 ORDER BY column1;

Но если вы храните даты в виде строк, преобразование может быть небезопасным на 100%.

0 голосов
/ 01 мая 2018

Как насчет двух объединений?

select t1.*, t2e.attribute_value, t2d.attribute_value
from table1 t1 left join
     table2 t2e
     on t1.col1 = t22.col1 and t1.col2 = t2e.col2 and t1.col3 = t2e.col3 and
        t2e.attribute_name = 'ENTITY_ID' left join
     table2 t2d
     on t1.col1 = t22.col1 and t1.col2 = t2e.col2 and t1.col3 = t2e.col3 and
        t2e.attribute_name = 'ACTIVATION_DATE';

Или, поскольку вам, похоже, ничего не нужно из table1, вы можете использовать group by:

select col1, col2, col3,
       max(case when attribute_name = 'ENTITY_ID' then attribute_value end),
       max(case when attribute_name = 'ACTIVATION_DATE' then attribute_value end)
from table2
group by col1, col2, col3;
...