11

私はテーブルを持っていますpartenaire。パートナーは、1 つまたは複数のアドレスを持つことができます。もちろん、1 つのアドレスが複数のパートナーに「属する」こともあります。partenaireしたがって、 、partenaire_adresseおよびの3 つのテーブルがありadresseます。アドレスには町が 1 つしかないため (フランス語で) 、テーブルにville外部キーがあります。id_villeaddresse

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

ここLEFT OUTER JOINで、最後のテーブル ( region) に対して a を実行すると、結果は同じではありません。

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 ではないため、「JOIN」または「LEFT OUTER JOIN」を実行すると、結果は同じになるはずです。または、何か不足していますか?

4

1 に答える 1

4

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

于 2013-04-02T22:16:55.517 に答える