Сравните две таблицы и найдите недостающие комбинации - PullRequest
0 голосов
/ 27 августа 2018

В моей главной таблице 3 столбца.

  1. Оценка (0-99,100-110)
  2. ставка (5-9, 10-15)
  3. местоположение (A, B)

И у меня есть все эти комбинации (2 * 2 * 2 = 8 комбинаций)

Ниже приведены комбинации в моей основной таблице

score     rate   location
----------------------------
 0-99      5-9     A
100-110    5-9     A
 0-99     10-15    A
100-110   10-15    A
0-99       5-9     B
100-110    5-9     B
0-99      10-15    B
100-110   10-15    B

У меня есть другая таблица с фактическими данными. Я хочу выяснить все недостающие комбинации в реальной таблице. Как найти эти пропущенные комбинации и добавить в фактическую таблицу значение «0» в столбце?

Фактические данные

score     rate   location  value 
---------------------------------
 0-99     10-15    A         3
100-110   10-15    A         6
0-99      10-15    B         1

Ожидаемый результат

 score     rate   location  value 
------------------------------------
 0-99        5-9     A           0   
 0-99        10-15   A           3
100-110     10-15    A           6
100-110      5-9     B           0
0-99        10-15    B           1
100-110     5-9      A           0
100-110    10-15     B           0
0-99       10-15     B           0

1 Ответ

0 голосов
/ 27 августа 2018

Вы можете попробовать CROSS JOIN сгенерировать декартово произведение для столбцов score, rate, location, составить полную таблицу.

затем выполните OUTER JOIN базу на CROSS JOIN таблице.

create table t(
  score varchar(50),
  rate varchar(50),
  location  varchar(50),
  value  int
);

insert into t values ('0-99','5-9','A',2);   
insert into t values ('0-99','10-15','A',3);
insert into t values ('100-110','10-15','A',6);
insert into t values ('100-110','5-9','B',7);
insert into t values ('0-99','10-15','B',1);

Запрос 1 :

SELECT  
  s.score,
  r.rate,
  l.location,
  coalesce(t1.value,0)
FROM 
(SELECT DISTINCT score FROM T) s
CROSS JOIN
(SELECT DISTINCT rate FROM T) r
CROSS JOIN
(SELECT DISTINCT location FROM T) l
LEFT JOIN t t1 on s.score = t1.score and t1.rate = r.rate and t1.location = l.location
ORDER BY  l.location  

Результаты

|   score |  rate | location | coalesce |
|---------|-------|----------|----------|
|    0-99 | 10-15 |        A |        3 |
|    0-99 |   5-9 |        A |        2 |
| 100-110 | 10-15 |        A |        6 |
| 100-110 |   5-9 |        A |        0 |
|    0-99 | 10-15 |        B |        1 |
|    0-99 |   5-9 |        B |        0 |
| 100-110 | 10-15 |        B |        0 |
| 100-110 |   5-9 |        B |        7 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...