2013-04-02 26 views
8

私はテーブルpartenaireを持っています。 partenaireは1つまたは複数のアドレスを持つことができます。もちろん、1つのアドレスは複数のパートナーに「属し」てもよい。だから私は3つのテーブル:partenairepartenaire_adresseadresseがあります。住所には唯一の町(villeフランス語)がありますので、addresseの表には外国のキーid_villeがあります。SQL結合と左外部結合:なぜ結果は異なりますか?

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; 

これは私にそれらの結果を与える:私は最後のテーブルの上にLEFT OUTER JOINregion)を行う場合

+----------------------------+-------------+------+------+--------+ 
| 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 | 
+----------------------------+-------------+------+------+--------+ 

は今、結果は同じではありません。

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にnullではないので、それはいけないと思うので、あなたがしなければ、結果は同じである必要があり、「結合」または「LEFT OUTER JOINを」 。または私は何かを逃していますか?

+2

各クエリにorder byを追加して、正面のいくつかのレコードに基づいて意味のある比較を行います。 –

答えて

4

発生している問題は、注文が指定されていない場合にSQLが結果の順序を保証しないという事実に関連しています。 ORDER BY句を追加すると、テーブルにすべての行(もちろん)に一致するキーがある場合、同じ結果が得られるはずです。

+0

私は "p.nomによる注文"を追加しました。私が得ないのは、テーブルpartenaireの "nom"のキーがあり、 "join"では28.9秒、 "left outer join"では0.10秒かかるということです!どうして? –

+0

正直なところ私は知らない。注文なしでのようなタイミングは何でしたか?両方のクエリで 'EXPLAIN'を使用して、それらがどのように異なって計画されているかを調べることができます。 – didierc

+0

+1は 'explain'です。私はこれを試してみる。 「注文なし」は0.10秒かかりました。 –

関連する問題