SQL连接和左外连接:为什么结果不同?

Oli*_*ons 9 mysql sql

我有一张桌子partenaire.partenaire可能有一个或多个地址.当然,一个地址可能"属于"不止一个partenaire.所以,我有3个表:partenaire,partenaire_adresseadresse.地址只有一个镇(ville法语)所以我id_ville在表中有一个外键addresse.

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;
Run Code Online (Sandbox Code Playgroud)

这给了我那些结果:

+----------------------------+-------------+------+------+--------+
| 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 | 
+----------------------------+-------------+------+------+--------+
Run Code Online (Sandbox Code Playgroud)

现在如果我LEFT OUTER JOIN在最后一个表(region)上做了一个结果不一样的结果:

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;
Run Code Online (Sandbox Code Playgroud)

结果不一样.看到:

+---------------------+----------+------+------+----------------+
| 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         | 
+---------------------+----------+------+------+----------------+
Run Code Online (Sandbox Code Playgroud)

我认为它不应该,因为在第一个查询中,id_region和id_departement不为null,所以如果你执行"JOIN"或"LEFT OUTER JOIN",结果应该是相同的.或者我错过了什么?

did*_*erc 4

您遇到的问题与以下事实有关:当未指定顺序时,SQL 不保证结果的顺序。如果添加 ORDER BY 子句,您应该得到相同的结果,前提是表的所有行上都有匹配的键(当然)。