2016-04-22 13 views
0

Ich habe Tabelle foo mit Säulen:Auswahl mehrmals gleiche Fremdschlüssel in SQL

fid, lat, long 
1, 0.1, 0.11 
2, 0.2, 0.22 
3, 0.3, 0.33 
4, 0.4, 0.44 

und Tabelle bar:

bid, f1, f2, f3 
1, 1, 2, 3 
2, 4, 3, 1 

ich die lat, long von f1 erhalten möchten, f2, f3 für jeden Eintrag von bar Tabelle.

Bisher habe ich die Abfrage erstellt:

select 
    b.bid, 
    f1.lat, f1.long, 
    f2.lat, f2.long, 
    f3.lat, f3.long 
from 
    bar as b, 
    foo as f1, 
    foo as f2, 
    foo as f3 
where 
    b.f1=f1.fid and 
    b.f2=f2.fid and 
    b.f3=f3.fid; 

bid, lat, long, lat, "long", "lat", "long" 
1, 0.1, 0.11, 0.2, 0.22, 0.3, 0.33 
2, 0.4, 0.44, 0.3, 0.33, 0.1, 0.11 

Die foo.fid und bar.bid sind Primärschlüssel. Außerdem kann ich jeden benötigten Index zu den Tabellen hinzufügen.

Gibt es eine schnellere effizientere Abfrage, um das gleiche Ergebnis zu erhalten?

+0

Haben Sie Indizes/Schlüssel? – jarlh

+0

Sorry @jarlh, ich habe es vergessen. Ich habe die Frage bearbeitet – ztik

Antwort

1

Ja. Führen Sie keine Joins im alten Stil durch, sondern explizite Joins.

select 
    b.bid, 
    f1.lat, f1.long, 
    f2.lat, f2.long, 
    f3.lat, f3.long 
from 
    bar as b left join foo as f1 on b.f1 = f1.fid 
    left join foo as f2 on b.f2 = f2.fid 
    left join foo as f3 on b.f3 = f3.fid 

Angenommen natürlich, dass Bid und Fid ein Primär-Fremdschlüsselpaar sind.

Wenn Sie eine große Tabelle haben oder es sich um ein sehr leistungsempfindliches Szenario handelt, sollten Sie Ihren Tabellen auf den Schlüsseln einen Index hinzufügen. Wenn für jedes Tupel von (f1, f2, f3) Werte in foo garantiert sind, können Sie stattdessen einen inneren Join verwenden.

+0

Danke! Warum ist das schneller? – ztik

+0

Nach meiner Erfahrung kommt die beste Leistung von expliziten inneren Verbindungen. Ein linker Join führt zuerst einen inneren Join aus und puffert dann alle fehlenden Werte mit Null-Extensions aus, so dass er im besten Fall genauso schnell ist wie ein innerer Join. Tatsächlich erhalten Sie den Knall für Ihr Geld, indem Sie Indizes zu den Schlüsseln hinzufügen. Verwenden Sie den inneren Join jedoch nur, wenn Sie sicher sind, dass Sie die gewünschten Daten erhalten. – user2316154

Verwandte Themen