Я решаю следующую задачу:
У меня есть несколько (разреженных) таблиц, которые имеют общее поле даты + общие «product_id». Кроме того, в каждой таблице есть одно дополнительное поле, в котором отслеживаются определенные данные о транзакциях для продукта, такие как «Продано единиц», «Куплено единиц», «Received_support_requests» и т. д.
Таблица 1
ДАТА | КОД ТОВАРА | ПРОДАННЫХ ЕДИНИЦ |
---|---|---|
2022-01-01 | 1 | 10 |
2022-01-02 | 2 | 40 |
Таблица 2
ДАТА | КОД ТОВАРА | ПРИОБРЕТЕННЫХ ЕДИНИЦ |
---|---|---|
2022-01-01 | 2 | 456 |
2022-01-04 | 5 | 34 |
Таблица 3
ДАТА | КОД ТОВАРА | ПОЛУЧЕННЫЕ ЗАПРОСЫ НА ПОДДЕРЖКУ |
---|---|---|
2022-01-04 | 5 | 2 |
2022-01-05 | 2 | 1 |
Мой цель каким-то образом присоединиться ко всем этим таблицам, чтобы я получил основную таблицу, которая показывает, что произошло с каждым продуктом в определенный день, как показано ниже используя MySQL:
ДАТА | КОД ТОВАРА | ПРОДАННЫХ ЕДИНИЦ | ПРИОБРЕТЕННЫХ ЕДИНИЦ | ПОЛУЧЕННЫЕ ЗАПРОСЫ НА ПОДДЕРЖКУ |
---|---|---|---|---|
2022-01-01 | 1 | 10 | 0 | 0 |
2022-01-01 | 2 | 0 | 456 | 0 |
2022-01-02 | 2 | 40 | 0 | 0 |
2022-01-04 | 5 | 0 | 34 | 2 |
2022-01-05 | 2 | 0 | 0 | 1 |
Все таблицы очень длинные > 50000 и содержат большой список продуктов> 3000
Сначала я подумал о создании своего рода каркаса («дата» - «идентификатор продукта»), а затем просто присоединил все таблицы к этой таблице каркаса. К сожалению, сочетание каждой даты с каждым продуктом становится слишком большим.
Как бы вы выполнили такое соединение более эффективным способом?
К сожалению, таблицы уже приходят в этом формате из источников данных, поэтому я ничего не могу с этим поделать. Спасибо, что напомнили мне, что это по-прежнему считается маленьким столом. Я имел в виду, что декартово произведение становится довольно большим.
SELECT date,
product_id,
COALESCE(table1.amount, 0) sold,
COALESCE(table2.amount, 0) purchased,
COALESCE(table3.amount, 0) supported
FROM ( SELECT date FROM table1
UNION
SELECT date FROM table2
UNION
SELECT date FROM table3 ) dates
CROSS
JOIN ( SELECT product_id FROM table1
UNION
SELECT product_id FROM table2
UNION
SELECT product_id FROM table3 ) products
NATURAL LEFT JOIN table1
NATURAL LEFT JOIN table2
NATURAL LEFT JOIN table3
HAVING sold + purchased + supported;
Вау, спасибо большое, это действительно работает! Мне просто нужно было изменить последнюю строку на WHERE (продано! = 0) ИЛИ (куплено! = 0) ИЛИ (поддержано! = 0), так как HAVING произвел ошибку значения. Я много читал о том, что ЕСТЕСТВЕННЫЕ соединения опасны, потому что в случае изменения имен полей запрос больше не будет работать и т. д. Есть ли альтернатива использованию ЕСТЕСТВЕННОГО ЛЕВОГО СОЕДИНЕНИЯ, или вы не видите проблемы с этим? ?
Наверное, было бы лучше не иметь для всего отдельных таблиц, а использовать единую таблицу значений атрибутов.