Определите недостающие комбинации, сравнив две таблицы - PullRequest
0 голосов
/ 28 августа 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

Ответы [ 2 ]

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

Исходя из ваших фактических данных и ожидаемого результата, значения столбцов score, rate, location кажутся фиксированными, поэтому вы можете использовать UNION ALL, чтобы score, rate, location были таблицами.

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

Тогда сделайте OUTER JOIN

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


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

Запрос 1 :

SELECT  
  s.score,
  r.rate,
  l.location,
  coalesce(t1.value,0)
FROM 
(
  SELECT '0-99' score
  UNION ALL
  SELECT '100-110'
) s
CROSS JOIN
(
  SELECT '10-15' rate
  UNION ALL
  SELECT '5-9'
) r
CROSS JOIN
(
  SELECT 'A' as "location"
  UNION ALL
  SELECT 'B'
) 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 |        0 |
| 100-110 | 10-15 |        A |        6 |
| 100-110 |   5-9 |        A |        0 |
| 100-110 |   5-9 |        B |        0 |
|    0-99 | 10-15 |        B |        1 |
| 100-110 | 10-15 |        B |        0 |
|    0-99 |   5-9 |        B |        0 |
0 голосов
/ 28 августа 2018

Использовать левое соединение с maintable и actualtable, а затем применять регистр, когда со столбцом значения

select t.score,t.rate,t.location, case when value is null then 0 else value end as value 
from t left join t1
on t.score=t1.score and t.rate=t1.rate 
and t.location=t1.location
...