Таблица t выглядит следующим образом:
+-----+------+-------+
| key | week | value |
+-----+------+-------+
| 1 | 1 | 10 |
| 1 | 2 | 20 |
| 2 | 1 | 100 |
| 2 | 2 | 200 |
| 2 | 3 | 300 |
+-----+------+-------+
key
2 имеет value
подарок для week
1, 2 и 3,
но key
1 имеет только value
для week
1 и 2
Как написать запрос на добавление строки для key
1 и отсутствующей week
3 со значением по умолчанию value
, равным 0, чтобы таблица результатов выглядела следующим образом:
+-----+------+-------+
| key | week | value |
+-----+------+-------+
| 1 | 1 | 10 |
| 1 | 2 | 20 |
| 1 | 3 | 0 |
| 2 | 1 | 100 |
| 2 | 2 | 200 |
| 2 | 3 | 300 |
+-----+------+-------+
Я пробовал как кросс-соединения, так и полные внешние соединения (в разных списках недель), но почему-то не смог прийти к желаемому решению.
Используйте cross join
для создания всех строк, а затем left join
для ввода значений:
select k.key, w.week, coalesce(t.value, 0) as value
from (select distinct key from t) k cross join
(select distinct week from t) w left join
t
on t.key = k.key and t.week = w.week
order by k.key, w.week;
При этом исходная таблица используется в качестве источника для ключей и недель. Если у вас есть другие таблицы с этой информацией, вы можете использовать ее.
@Деннис. . . Я удалил псевдонимы столбцов с одним символом. Это были опечатки.
Спасибо Гордон!!! Не могли бы вы обновить приведенный выше запрос с исправленными псевдонимами, чтобы он не смущал других? (в настоящее время выдает ошибку) выберите kk, ww, объединение (t.value, 0) в качестве значения из (выберите отдельный ключ k из t) k перекрестное соединение (выберите отдельную неделю w из t) w левое соединение t на t.key = kk и t.week = ww упорядочены по kk, ww;