【问题标题】:SQL join and left outer join: why are the results different? [duplicate]SQL 连接和左外连接:为什么结果不同? [复制]
【发布时间】:2013-03-24 09:49:20
【问题描述】:

我有一张桌子partenaire。合伙人可能有一个或多个地址。当然,一个地址可能“属于”多个合伙人。所以我有 3 个表:partenairepartenaire_adresseadresse。该地址只有一个城镇(法语为ville),所以我在表addresse 中有一个外键id_ville

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;

这给了我这些结果:

+----------------------------+-------------+------+------+--------+
| 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,结果会不一样:

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;

结果不一样。见:

+---------------------+----------+------+------+----------------+
| 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_departement 不为空,所以如果你做一个“JOIN”或“LEFT OUTER JOIN”,结果应该是一样的。还是我错过了什么?

【问题讨论】:

  • 为每个查询添加一个排序依据,以便根据前面的几条记录进行任何有意义的比较。

标签: mysql sql


【解决方案1】:

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

【讨论】:

  • 我添加了“按 p.nom 订购”,它适用于两者。我没有得到的是表partenaire的“nom”上有一个键,“join”需要28.9s,而“left outer join”需要0.10s!怎么来的?
  • 老实说我不知道​​。没有订单的时间是怎样的?您可以尝试在两个查询中使用EXPLAIN,看看它们的计划有何不同。
  • +1 表示explain。我会试试这个。至于“没有order by”,用了0.10s。
  • 很有趣,请随时发布您的发现作为问题的更新,或者如果没有现有的等效问题,请提出新问题。
猜你喜欢
  • 2017-02-26
  • 1970-01-01
  • 2011-04-22
  • 2010-10-01
  • 2013-03-03
  • 1970-01-01
  • 2016-10-02
相关资源
最近更新 更多