关于MySQL:SQL连接和左外部连接:为什么结果不同?

SQL join and left outer join: why are the results different?

本问题已经有最佳答案,请猛点这里访问。

我有一张桌子。一个合作伙伴可以有一个或多个地址。当然,一个地址可能"属于"多个部分。所以我有3张桌子:partenairepartenaire_adresseadresse。地址只有一个城镇(法语为ville,所以我在表addresse中有一个外键id_ville

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;

这给了我这些结果:

1
2
3
4
5
6
7
8
+----------------------------+-------------+------+------+--------+
| 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 |
+----------------------------+-------------+------+------+--------+

现在,如果我在最后一张表(region上)上执行LEFT OUTER JOIN操作,结果就不一样了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;

结果不一样。见:

1
2
3
4
5
6
7
8
+---------------------+----------+------+------+----------------+
| 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         |
+---------------------+----------+------+------+----------------+

我认为不应该,因为在第一个查询中,id_region和id_department不为空,所以如果您执行"join"或"left outer join",结果应该是相同的。还是我错过了什么?


您遇到的问题与以下事实有关:当没有指定顺序时,SQL对结果的顺序不作任何保证。如果您添加了ORDERBY子句,那么您应该得到相同的结果,前提是表中的所有行都有匹配的键(当然)。