SQL - объединить таблицы в несколько столбцов - PullRequest
0 голосов
/ 03 марта 2020

Я хочу объединить несколько таблиц:

table1:
A     B_key    B_version    C      D
123    abc        1         ccc    11  
123    abc        2         ddd    11
456    dfg        1         rrr    22
789    vvv        1                55

table2:
A     E   F 
123   s   5 
456   r   
111   t   2

table3:
B_key   B_version   G
abc        1        aa
abc        1        bb
abc        2        aa
abc        2        cc
dfg        1        aa

, чтобы результат выглядел так:

A      B_key B_version       C      D    E       F    G
123    abc        1         ccc    11    s       5    aa
123    abc        1         ccc    11    s       5    bb
123    abc        2         ddd    11    s       5    aa
123    abc        2         ddd    11    s       5    cc
456    dfg        1         rrr    22    r            aa
789    vvv        1                55    

Версия может go до 8.

ЕСЛИ у меня нет A, B_key или B_version - строка бесполезна. В противном случае мне нужно сохранить всю имеющуюся у меня информацию.

На самом деле у меня гораздо больше столбцов.

Я пробовал:

SELECT table1.A, table 1.B_key, table 1.B_version, table 1.C, table 1.D,
       table2.E, table2.F,
       table3.G
FROM table1
LEFT JOIN table2
     ON table1.A = table2.A
LEFT JOIN table3
     ON table1.B_key = table3.B_key AND
        table1.B_version = table3.B_version

и то же самое с ПОЛНОЕ СОЕДИНЕНИЕ.

В итоге получается то же самое: для каждого B_key сохраняется только самый высокий B_version, а остальные исчезают.

Как мне избежать потери информации?

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Вы можете использовать левые объединения между таблицами, как показано ниже:

select t1.A, t1.B_key, t1.B_version, t1.C, t1.D, t2.E, t2.F, t3.G
  from table1 t1
  left join table2 t2 on t2.A = t1.A
  left join table3 t3 on t3.B_key = t1.B_key and t3.B_version = t1.B_version

Демо

, чтобы также приводить строки для несопоставленных значения для условий соединения.

0 голосов
/ 03 марта 2020

Если я правильно понимаю, вам нужны все b_key s и b_version s из table1 и table3. Затем вы хотите ввести другие данные. Это предполагает левые соединения

select . . .
from ((select B_key, B_version 
       from table1
      ) union -- on purpose to remove duplicates
      ( select B_key, B_version  
       from table3
      )
     ) bb left join
     table1 t1
     on t1.b_key = bb.b_key and
        t1.b_version = bb.b_version left join
     table2 t2
     on t2.a = t1.a left join
     table3 t3
     on t1.b_key = bb.b_key and
        t1.b_version = bb.b_version;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...