Cross join ignora clausola WHERE
-
10-10-2019 - |
Domanda
Tabella: Shopping
shop_id shop_building shop_person shop_time
1 1 Brian 40
2 2 Brian 31
3 1 Tom 20
4 3 Brian 30
Tabella: edifici
building_id building_city
1 London
2 Newcastle
3 London
4 London
Tabella: le banane
banana_id banana_building banana_amount banana_person
1 2 1 Brian
2 3 1 Brian
2 1 1 Tom
Ora voglio che mi mostra la quantità di banane ogni persona ha comprato a Londra.
ho usato questo codice:
SELECT tt.*, tu.*, tz.*,
SUM(shop_time) AS shoptime,
Ifnull(banana_amount, 0) AS bananas
INNER JOIN buildings tu ON tt.shop_building=tu.building_id
FROM shopping tt
LEFT OUTER JOIN (SELECT banana_person, banana_building,
SUM(banana_amount) AS banana_amount
FROM bananas
GROUP BY banana_person) tz
ON tt.shop_person = tz.banana_person AND tt.shop_building = tz.banana_building
WHERE tu.building_city = 'London'
GROUP BY shop_person;
Ma non funziona. E 'come se io dico troppo tardi, che dovrebbe guardare solo a Londra, in quanto ignora questo.
Soluzione
Senza sapere che cosa database in uso, qui è una versione funzionante per MSSQL. Io in realtà ricostruito i tavoli per assicurarsi che sia corretto.
Per gli altri sistemi di database probabilmente dovrete utilizzare un altra funzione che ISNULL
nell'istruzione SELECT.
SELECT tt.shop_person,
tt.shop_building,
SUM(tt.shop_time) AS shoptime,
ISNULL(SUM(tz.banana_amount), 0) AS bananas
FROM dbo.shopping tt
INNER JOIN dbo.buildings tu ON tt.shop_building = tu.building_id
LEFT OUTER JOIN
(SELECT banana_person, banana_building, SUM(banana_amount) AS banana_amount
FROM bananas
GROUP BY banana_person, banana_building) tz
ON tt.shop_person = tz.banana_person AND tt.shop_building = tz.banana_building
WHERE (tu.building_city = 'London')
GROUP BY tt.shop_person, tt.shop_building
ho dovuto aggiungere una funzione di aggregazione intorno tz.banana_amount
- che uno (SUM, MIN, MAX) non importa ??p>.
Risultato:
shop_person shop_building shoptime bananas
Brian 1 40 0
Tom 1 20 1
Brian 3 30 1
Ho suonato in giro con diverse quantità di bananas
ecc e funziona correttamente.
Altri suggerimenti
Prova in questo modo:
SELECT
s.shop_person, sum(b.banana_amount) as Amt, , sum(shop_time) as TimeAmt
FROM bananas b
INNER JOIN buildings bu ON b.banana_building = bu.building_id
INNER JOIN shopping s ON bu.building_id = s.shop_building
WHERE
bu.building_city = N'London'
GROUP BY s.shop_person
Questa query è diversa, ma fa quello che vuoi - 'la quantità di banane ogni persona ha comprato a Londra'