Есть ли способ взять переменные и добавить их в виде столбцов после левого соединения в SQL? - PullRequest
0 голосов
/ 12 ноября 2019

У меня есть 2 таблицы: таблица A:

| ID |  class1     |  class2 | class3 |  class4 |
+----+-------------+---------+--------+---------+
|  1 |  ABC123     |  23     | C123   | BC123   | 
|  2 |  DEF465     |  65     | F465   | EF465   | 
|  3 |  GHI789     |  89     | I789   | HI789   |
|  4 |  JKL132     |  32     | L132   | KL132   |
|  5 |  MNO456     |  56     | O456   | NO456   |

и таблица B:

| ID |  class_desc |     text   | 
+----+-------------+------------+
|  1 |  ABC123     |  "foo"     |  
|  2 |  23         |  "foo b"   |
|  3 |  C123       |  "foo bar" | 
|  4 |  BC123      |  "foo-bar" | 
|  5 |  DEF465     |  "bar"     | 
|  6 |  65         |  "bar f"   | 
|  7 |  F465       |  "bar foo" | 
|  7 |  EF465      |  "bar-foo" | 
etc...

Я хочу сделать левое соединение, где получаю таблицу, подобную таблице C:

| ID |  class1  |  class2 | class3 |  class4 | class_1_desc | class_2_desc | class_3_desc| class_4_desc|
+----+----------+---------+--------+---------+--------------+--------------+-------------+-------------+
|  1 |  ABC123  |  23     | C123   | BC123   | "foo"        |"foo b"       |"foo bar"    |"foo-bar"    |
|  2 |  DEF465  |  65     | F465   | EF465   | "bar"        |"bar f"       |"bar foo"    |  "bar-foo"  |
|  3 |  GHI789  |  89     | I789   | HI789   | etc...
|  4 |  JKL132  |  32     | L132   | KL132   |
|  5 |  MNO456  |  56     | O456   | NO456   |

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 12 ноября 2019

Вы можете присоединиться 4 раза:

select 
    ta.*,
    tb1.text class_1_desc,
    tb2.text class_2_desc,
    tb3.text class_3_desc,
    tb4.text class_4_desc
from tableA ta
inner join tableB tb1 on tb1.class_desc = ta.class1
inner join tableB tb2 on tb2.class_desc = ta.class2
inner join tableB tb3 on tb3.class_desc = ta.class3
inner join tableB tb4 on tb4.class_desc = ta.class4

Если существует вероятность того, что один из class объявленных в tableA не существует в tableB, то вы хотите left joins вместо inner join s.

Если вы действительно хотите создать новую таблицу, скажем tableC, с результатами запроса, то вы можете использовать синтаксис create table ... as select:

create table tableC as
select 
    ta.*,
    tb1.text class_1_desc,
    tb2.text class_2_desc,
    tb3.text class_3_desc,
    tb4.text class_4_desc
from tableA ta
inner join tableB tb1 on tb1.class_desc = ta.class1
inner join tableB tb2 on tb2.class_desc = ta.class2
inner join tableB tb3 on tb3.class_desc = ta.class3
inner join tableB tb4 on tb4.class_desc = ta.class4

Демонстрация на DB Fiddle (с использованием left join с, так как данные образца неполные):

ID | class1 | class2 | class3 | class4 | class_1_desc | class_2_desc | class_3_desc | class_4_desc
-: | :----- | -----: | :----- | :----- | :----------- | :----------- | :----------- | :-----------
 1 | ABC123 |     23 | C123   | BC123  | foo          | foo b        | foo bar      | foo-bar     
 2 | DEF465 |     65 | F465   | EF465  | bar          | bar f        | bar foo      | <em>null</em>        
 3 | GHI789 |     89 | I789   | HI789  | <em>null</em>         | <em>null</em>         | <em>null</em>         | <em>null</em>        
 4 | JKL132 |     32 | L132   | KL132  | <em>null</em>         | <em>null</em>         | <em>null</em>         | <em>null</em>        
 5 | MNO456 |     56 | O456   | NO456  | <em>null</em>         | <em>null</em>         | <em>null</em>         | <em>null</em>        
0 голосов
/ 12 ноября 2019

Вы, кажется, хотите несколько left join s:

select a.*,
       b1.text as text_1,
       b2.text as text_2,
       b3.text as text_3,
       b4.text as text_4
from a left join
     b b1
     on b1.class_desc = a.class1 left join
     b b2
     on b2.class_desc = a.class2 left join
     b b3
     on b3.class_desc = a.class3 left join
     b b4
     on b4.class_desc = a.class4;
...