2013-03-19 21 views
6

voglio ottenere i SUM(column_a) da due tabelle diverse, e ottenere la loro differenza. Sto usando MySQL.Come unire 2 tavoli senza una clausola ON

Table A's sum = 1234

Table B's sum = 4001

non sono sicuro di cosa mettere nel mio ON clausola:

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

come una nota a margine la clausola 'on' non deve usare le proprietà delle tabelle che si possono avere' select * da tableA inner join tableB su 1 = 1' e otterrà la stessa cosa di un cross join –

risposta

11

un join senza condizione è un cross join. Un cross join ripete ogni riga della tabella a sinistra per ogni riga della tabella mano destra:

FROM table_a a 
CROSS JOIN table_b b 

noti che in MySQL, cross join/join/inner join sono identici. Così si potrebbe scrivere:

FROM table_a a 
JOIN table_b b 

Finché si omette la clausola on, questo funzionerà come un cross join.

Se vuoi sommare due colonne da due tabelle, una cross join non avrebbe funzionato perché ripete righe. Otterrai numeri molto gonfiati. Per le somme, un approccio migliore usa sottoquery, per @sgeddes risposta.

4

Ecco un'opzione utilizzando sottoquery - ci sono diversi modi per farlo:

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 Nella rilettura, questo è in realtà ciò che il PO intende fare. – Andomar

0

si desidera riepilogare prima e poi fare i calcoli:

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 

Fare la cross join tra i tavoli genererà un prodotto cartesiano che rovinerà le tue somme.

Problemi correlati