2013-04-02 21 views
8

partenaire tablosum var. Bir partenaire bir veya daha fazla adrese sahip olabilir. Ve elbette bir adres birden fazla partiye “ait” olabilir. Yani 3 tablom var: partenaire, partenaire_adresse ve adresse. Adresin tek bir kasabası var (ville Fransızca) id_ville numaralı yabancı bir anahtarım var addresse.SQL birleştirme ve sol dış birleştirme: sonuçlar neden farklı?

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; 

Bu bana bu sonuçlar verir: Geçen masada bir LEFT OUTER JOIN yaparsak

+----------------------------+-------------+------+------+--------+ 
| 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) sonuçları aynı değildir:

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; 

değil aynı Sonuçlar. Bkz:

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

Ben ilk sorgu, id_region ve id_departement null değildir çünkü, değil gerektiğini düşünüyorum, bu yüzden böyle yaparsanız bir, sonuçlar aynı olmalıdır "JOIN" veya bir "SOL DIŞ JOIN" . Yoksa bir şey mi özlüyorum?

+2

Her bir sorguya göre, her iki kayda göre, herhangi bir anlamlı karşılaştırma yapmak için bir sipariş ekleyin. –

cevap

4

Karşılaştığınız sorun, SQL'in hiçbir sipariş belirtilmemişse, sonuç sırasına ilişkin bir garanti vermemesi gerçeğiyle ilgilidir. Bir ORDER BY yan tümcesi eklerseniz, tabloların tüm satırlarda (tabii ki) eşleşen anahtarlara sahip olması koşuluyla, aynı sonuçları almanız gerekir.

+0

"order by p.nom" ifadesini ekledim ve her ikisi için de çalışıyor. Ne alamadım tablo partenaire "nom" bir anahtar var ve "birleştir" ile 28.9s alır ve "sol dış birleştirme" ile, 0.10s alır! Nasıl gelir? –

+0

Oldukça bilmiyorum. Siparişsiz zamanlamalar nasıldı? Ne kadar farklı bir şekilde planlandığını görmek için her iki sorgunda 'EXPLAIN 'kullanmayı deneyebilirsiniz. Açıklama için – didierc

+0

+1. Bunu deneyeceğim. "Sipariş olmadan", 0.10s aldı. –

İlgili konular