2012-01-08 13 views
19

Questo è un db postgres. Sto tentando di estrarre nomi di razze di cani (Cane Corso, Labrador, ecc.) Da una tabella di razza, per visualizzare in base alle chiavi estranee situate in una tabella animale. Il mio problema è che la tabella degli animali ha due chiavi esterne a questa tabella di razza singola, e continuo a ricevere errori con la mia query. Il nome della prima razza verrà restituito in base a un join di sinistra, mentre il secondo non è possibile visualizzare il nome poiché ho già un join di sinistra. Di seguito è riportato uno schema semplificato di quello che sto cercando di fare:Postgres multiple join

breed table (ID, BreedName) 
animal table (ID, breedID, breed2ID) 

SELECT animal.ID, breed.BreedName FROM animal LEFT JOIN breed ON animal.breedID=breed.ID WHERE animal.ID='7'; 

Cosa devo fare è ottenere il BreedName di unirsi per animal.breed2ID che sto fallendo miseramente a. Potrei facilmente codificare con difficoltà i nomi di razza e visualizzarli nell'applicazione, ma ciò non è favorevole a modifiche, aggiunte o cancellazioni di nomi di razza nel database.

risposta

38

basta fare un altro unirsi su quello stesso tavolo:

SELECT animal.ID, breed1.BreedName as BreedName1, breed2.BreadName as BreadName2 
FROM animal 
    LEFT JOIN breed as breed1 ON animal.breedID=breed1.ID 
    LEFT JOIN breed as breed2 ON animal.breedID=breed2.ID 
WHERE animal.ID='7'; 
+0

Grazie mille. Questo ha chiarito e ha funzionato esattamente come previsto! Stavo scherzando solo facendo una razza.AnimalName AS breedName1, breed.AnimalName AS breedName2. Completamente mancato l'aliasing del tavolo! Grazie ancora, questo è il miglior aiuto che ho visto sui siti tecnologici! – user1137376

+0

Hey nessun problema, ecco perché siamo qui: D Sono anche d'accordo con il post di StarShip3000. Ma ho pensato che i cani con 3 o più razze non si verifichino. Ma se lo fanno, assicurati di prendere l'avviso raccomandato da Star. – kingdaemon

14

Mentre Ivan ha risolto il problema per il database corrente progettare una considerazione a lungo termine o solo una cosa da imparare da sarebbe quello di rendere la vostra struttura della tabella di più normalizzato in modo tale che dover aggiungere un nuovo join ogni volta che si desidera aggiungere una razza ad un animale non è necessario. Attraverso questo semplice design hai reso la tua vita più difficile.

Quando vedete tipi di proprietà ripetuti su un'entità, nel vostro caso breedID e breed2ID dovreste in genere iniziare a sentire l'odore di qualcosa di marcio in tutti i casi tranne rarissimi.

Sotto il design ideale si dovrebbe fare quanto segue.

1. Mantenere la razza così com'è.

2. Fa sembrare l'animale come qualcosa di simile a un animale (animal_id, animal_name).

3.Aggiungi una nuova tabella animale_breed. Sembrerebbe questo animal_breed (animal_breed_id, animal_id, breed_id). Con animal_bread_id è un pk e una chiave univoca su (animal_id, breed_id) con chiavi esterne che rimandano alle rispettive tabelle.

Questo disegno consente a un determinato animale di assumere uno o più tipi di razza senza dover mai risolvere la ricerca per restituire le razze multiple. Il tuo attuale design diventa un incubo ogni volta che hai un animale con una razza in più. Ha il potenziale per uccidere le prestazioni e rendere la manutenzione un incubo e in più non è un buon progetto di database.

Problemi correlati