2013-03-19 2 views
6

Я хочу получить SUM(column_a) из двух разных таблиц и получить их разницу. Я использую MySQL.Как присоединиться к 2 столам без предложения ON

Table A's sum = 1234

Table B's sum = 4001

Я не уверен, что положить в моей статье ON:

SELECT 
    SUM(a.column1) AS table_a_sum, 
    SUM(b.column1) AS table_b_sum, 
    SUM(a.column1) - SUM(b.column1) AS difference 
FROM table_a a 
JOIN table_b b 
ON ?????? 
+0

В качестве примечания стороны 'on' не должны использовать свойства таблиц, которые вы можете выбрать' select * из таблицыA inner join tableB на 1 = 1' и получите то же самое, что и перекрестное соединение –

ответ

11

Объединения без условий является перекрестным объединением. Перекрестное соединение повторы каждой строки для левой руки таблицы для каждой строки в правой таблице руки:

FROM table_a a 
CROSS JOIN table_b b 

Обратите внимание, что в MySQL, cross join/join/inner join идентичны. Таким образом, вы могли бы написать:

FROM table_a a 
JOIN table_b b 

Пока вы пропустите предложение on, это будет работать, как перекрестное соединение.

Если вы хотите суммировать два столбца из двух таблиц, перекрестное объединение не будет работать, поскольку оно повторяет строки. Вы получите сильно завышенные цифры. Для сумм лучший подход использует подзапросы, на ответ @sgeddes.

4

Вот один вариант с использованием подзапросов - есть несколько способов сделать это:

SELECT 
    table_a_sum, 
    table_b_sum, 
    table_a_sum - table_b_sum AS difference 
FROM 
    (SELECT SUM(column1) table_a_sum FROM table_a) a, 
    (SELECT SUM(column1) table_b_sum FROM table_b) b 
+1

+ 1 При повторном чтении это фактически то, что намеревается сделать ОП. – Andomar

0

Вы хотите подвести итоги первого, а затем сделать расчеты:

select a.suma, b.sumb, a.suma - b.sumb 
from (select sum(a.column1) as suma from tablea) a cross join 
    (select sum(b.column1) as sumb from tableb) b 

, делающего cross join между таблицами будет генерировать декартовую продукцию, которая испортит ваши суммы.

Смежные вопросы