Как объединить две таблицы, когда нет совпадений? - PullRequest
0 голосов
/ 27 мая 2018

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

ТАБЛИЦА A

ID_A     VALUE_A
-----------------
A           1     
B           2     

ТАБЛИЦА B

ID_B   ID_A    VALUE_B
-------------------------
90       A        1
90       C        1
90       E        1  
91       A        1
91       B        1
92       B        1
92       E        1
92       F        1

Я хочу получить такой результат:

ID_A   VALUE_A     ID_B     ID_A   VALUE_B 
-------------------------------------------------
A        1          90        A       1 
B        2          90        NULL    NULL 
A        1          91        A       1 
B        2          91        B       1
A        1          92        NULL    NULL
B        2          92        B       1

Ответы [ 4 ]

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

Я не смог определить точную логику и не смог сопоставить результаты точно так, как хотелось бы, но предположил, что вы хотите получить что-то вроде:

SELECT a.ID_A, COALESCE(a.VALUE_A,b.VALUE_B) VALUE_A, b.ID_B, a.ID_A, 
       (CASE WHEN a.ID_A IS NULL THEN a.ID_A ELSE CAST(b.VALUE_B as VARCHAR(1)) END) 
       as VALUE_B
  FROM TABLE_A a FULL OUTER JOIN TABLE_B b 
  ON ( a.ID_A = b.ID_A )
 GROUP BY a.ID_A, a.VALUE_A, b.ID_B, a.ID_A, b.VALUE_B 
 ORDER BY 3, 2, 1;

SQL FiddleDemo

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

Если я правильно понимаю, вам нужны все комбинации id_a и value_a из первой таблицы вместе со всеми отличными id_b из второй таблицы.Если это так:

select iv.id_a, iv.value_a, ib.id_b, b.id_a, b.value_b
from (select distinct id_a, value_a from a) iv cross join
     (select distinct id_b from b) ib left join
     b
     on b.id_b = ib.id_b and b.id_a = iv.id_a;

cross join создает строки.left join добавляет дополнительные столбцы.

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

Я обычно разбиваю такие вещи на CTE:

DDL

use tempdb

CREATE TABLE Table1
    ([ID_A] varchar(1), [VALUE_A] int)
;

INSERT INTO Table1
    ([ID_A], [VALUE_A])
VALUES
    ('A', 1),
    ('B', 2)
;


CREATE TABLE Table2
    ([ID_B] int, [ID_A] varchar(1), [VALUE_B] int)
;

INSERT INTO Table2
    ([ID_B], [ID_A], [VALUE_B])
VALUES
    (90, 'A', 1),
    (90, 'C', 1),
    (90, 'E', 1),
    (91, 'A', 1),
    (91, 'B', 1),
    (92, 'B', 1),
    (92, 'E', 1),
    (92, 'F', 1)
;

Ответ

with a as (
        select distinct id_b
        from Table2
),
b as (
        select  id_a, value_a, id_b
        from    Table1 cross join a
)
select  b.id_a, b.value_a, b.id_b, t2.id_a, t2.value_b
from    b left join Table2 t2
        on b.id_a = t2.id_a
        and b.id_b = t2.id_b

Результаты

+------+---------+------+------+---------+
| id_a | value_a | id_b | id_a | value_b |
+------+---------+------+------+---------+
| A    |       1 |   90 | A    | 1       |
| B    |       2 |   90 | NULL | NULL    |
| A    |       1 |   91 | A    | 1       |
| B    |       2 |   91 | B    | 1       |
| A    |       1 |   92 | NULL | NULL    |
| B    |       2 |   92 | B    | 1       |
+------+---------+------+------+---------+
0 голосов
/ 27 мая 2018

Попробуйте это:

SELECT A.ID_A , A.VALUE_A , B.ID_B , B.ID_A , B.VALUE_B
  FROM            TABLE_A A
  LEFT OUTER JOIN TABLE_B B
   ON A.ID_A = B.ID_A ;

РЕДАКТИРОВАТЬ : опечатки исправлены после заметки (спасибо !!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...