Как объединить несколько таблиц MySQL с разными строками?

Мне нужно собрать количества с нескольких складов, которые периодически обновляют свои запасы. Файлы автоматически загружаются в таблицы моей базы данных MySQL, но иногда в одном хранилище файлов может быть на несколько больше или меньше, чем в других. Мне нужно добавить их все, чтобы определить общее количество, доступное для всей сети.

Моя идея состояла в том, чтобы сделать:

    SELECT
        IFNULL(branch_01.qty,0) +
        IFNULL(branch_02.qty,0) +
        IFNULL(branch_03.qty,0) +

и т.д. через все склады, присоединенные как:

    FROM branch_01 
        JOIN branch_02
        USING (oespaced)
        JOIN branch_03 
        USING (oespaced)

и т.д. по всем складам

Я не могу использовать LEFT JOIN или RIGHT JOIN, потому что иногда на одном складе могут отсутствовать записи, а иногда на другом. Если sku отсутствует в файле одной ветки, я бы предпочел, чтобы другие ветки были добавлены вместе и просто получили NULL, который был бы преобразован в 0 функциями в SELECT. Когда я тестировал различные решения для соединения, я также, кажется, получаю декартово число строк, что еще больше меня смущает. Любое руководство приветствуется.

Небольшое уточнение: нам нужно объединить 17 таблиц. На самом деле нас интересует не сумма столбца, а отдельные значения. Например, таблица может представлять список элементов a, b, c, d и перечислять количества 1, 2, 3, 4. У нас была бы эта таблица из нескольких разных складов, и нам нужно было бы найти общую сумму для всей сети. Если бы четыре склада имели эти значения, мы бы хотели видеть a,b,c,d с 4,8,12,16 в качестве значений для общего количества доступных.


person user3326985    schedule 19.02.2014    source источник
comment
Я понимаю, почему LEFT JOIN и RIGHT JOIN у вас не работают, но пробовали ли вы FULL OUTER JOIN?   -  person PaF    schedule 19.02.2014
comment
Я думаю, что ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ было бы хорошим решением, но, насколько я понимаю, MySQL не поддерживает это, и оно будет реализовано путем выполнения ЛЕВОГО СОЕДИНЕНИЯ слева и ПРАВОГО СОЕДИНЕНИЯ справа.   -  person user3326985    schedule 19.02.2014
comment
Спасибо за разъяснение - к сожалению, все еще очень неясно. Я думаю, что конкретный пример (таблица t1 имеет столбцы c1, c2 и значения (v1a, v2a), (v1b, v2b), таблица t2 имеет столбцы... и т. д.) поможет. В любом случае, если правильным решением является ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, а в MySQL вы не можете этого сделать, то смоделируйте его (как вы сами упомянули).   -  person PaF    schedule 20.02.2014


Ответы (1)


Я не совсем понимаю ваш вопрос, но надеюсь, что мой ответ вам немного поможет. Вы присоединяетесь ко многим столам? Итак, скажем, 2 таблицы, и вы хотите суммировать столбец количества?

Прежде всего, JOIN выполняет декартово произведение 2 (или более) таблиц. Таким образом, вы получите так много экземпляров, которые вам не нужны; решение этой проблемы заключается в использовании WHERE.

Возможно, это то, что вы ищете:

SELECT sum(a.qty) + sum(b.qty)
FROM table1 a, table2 b
WHERE a.pk = b.fk -- this one resolves the unwanted instances

fk обозначает внешний ключ, а pk обозначает первичный ключ.

person krato    schedule 19.02.2014
comment
Большое спасибо за предложения @krato. Я отредактировал свой исходный вопрос, чтобы, надеюсь, добавить небольшое пояснение. ГДЕ, которое вы предложили, вероятно, является ответом, но я не знаю, как это сделать с нашими плохими данными, так как одна ветвь может сообщать только a, b, c, а другая может сообщать только b, c и т. д. Если ветвь не Чтобы сообщить об элементе, нам все равно нужно знать значения из других ветвей, а не исключать их из результатов. - person user3326985; 19.02.2014