Ho un tavolo partenaire
. Un partenaire può avere uno o più indirizzi. E ovviamente un indirizzo può "appartenere" a più di un partenaire. Quindi ho 3 tavoli: partenaire
, partenaire_adresse
e adresse
. L'indirizzo ha una sola città (ville
in francese) quindi ho una chiave esterna id_ville
nella tabella addresse
.Join SQL e join esterno sinistro: perché i risultati sono diversi?
SELECT
p.nom,
v.nom, v.id_region as id_r, v.id_departement as id_p,
r.description as region
FROM partenaire p
JOIN partenaire_adresse pa
ON pa.id_partenaire=p.id
JOIN adresse a
ON a.id=pa.id_adresse
JOIN ville v
ON v.id=a.id_ville
JOIN region r
ON v.id_region=r.id
LIMIT 4;
Questo mi dà questi risultati:
+----------------------------+-------------+------+------+--------+
| nom | nom | id_r | id_p | region |
+----------------------------+-------------+------+------+--------+
| Ferme Auberge Christlesgut | Breitenbach | 1 | 2 | Alsace |
| Alice Pizza | Strasbourg | 1 | 1 | Alsace |
| Au Vieux Cellier | Strasbourg | 1 | 1 | Alsace |
| Auberge du 7Eme Art | Strasbourg | 1 | 1 | Alsace |
+----------------------------+-------------+------+------+--------+
Ora, se faccio un LEFT OUTER JOIN
l'ultimo tavolo (region
) i risultati non sono gli stessi:
SELECT
p.nom,
v.nom, v.id_region as id_r, v.id_departement as id_p,
r.description as region
FROM partenaire p
JOIN partenaire_adresse pa
ON pa.id_partenaire=p.id
JOIN adresse a
ON a.id=pa.id_adresse
JOIN ville v
ON v.id=a.id_ville
LEFT OUTER JOIN region r
ON v.id_region=r.id
LIMIT 4;
Non
stesso risultati. Vedere:
+---------------------+----------+------+------+----------------+
| nom | nom | id_r | id_p | region |
+---------------------+----------+------+------+----------------+
| 'Le 144' Petrossian | Paris 18 | 12 | 43 | Île-de-France |
| 'Le 144' Petrossian | Paris 08 | 12 | 43 | Île-de-France |
| 'O'Quai' | Vouvray | 7 | 26 | Centre |
| 'O'Quai' | Tours | 7 | 26 | Centre |
+---------------------+----------+------+------+----------------+
Penso che non dovrebbe, perché nella prima query, id_region e id_departement non sono nulla, quindi se si fa un "join" o un "LEFT outer join", i risultati dovrebbero essere gli stessi . O mi sta sfuggendo qualcosa?
Aggiungere un ordine a ogni query per effettuare qualsiasi tipo di confronto significativo basato su alcuni record nella parte anteriore. –