2012-01-08 7 views
19

Esto es un db postgres. Estoy intentando extraer los nombres de las razas de perros (Cane Corso, Labrador, etc.) de una tabla de crías para que se muestren según las claves externas ubicadas en una tabla de animales. Mi problema es que la tabla animal tiene dos claves externas para esta tabla de una sola raza, y sigo recibiendo errores con mi consulta. El primer nombre de raza volverá basado en una combinación de la izquierda, pero en el segundo no puedo obtener el nombre para mostrar ya que tengo una combinación de la izquierda. A continuación se muestra un esquema simplificado de lo que estoy tratando de hacer:Uniones múltiples Postgres

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'; 

Lo que tengo que hacer es también obtener el BreedName a unirse para animal.breed2ID la que estoy fallando miserablemente en. Podría codificar fácilmente los nombres de la raza y hacer que se muestren en la aplicación, pero esto no es propicio para cambios, adiciones o eliminaciones de nombres de crías en la base de datos.

Respuesta

38

acaba de hacer otra unirse en esa misma mesa:

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

Muchas gracias. ¡Eso lo aclaró y funcionó exactamente como estaba planeado! Lo estaba estropeando solo haciendo una raza. NombreAnimal AS breedName1, breed.AnimalName AS breedName2. Completamente perdido el aliasing de la mesa! ¡Gracias de nuevo, esta es la mejor ayuda que he visto en sitios tecnológicos! – user1137376

+0

Hola, no hay problema, es por eso que estamos aquí: D También estoy de acuerdo con la publicación de StarShip3000. Pero supuse que los perros con 3 o más razas no sucederían. Pero si lo hacen, asegúrese de tomar el enfoque recomendado por Star. – kingdaemon

14

Mientras que Iván ha resuelto el problema de su base de datos actuales del diseño de una consideración a largo plazo o simplemente una cosa que aprender de que sería para hacer su diseño de la mesa más Normalizado por lo que no es necesario tener que agregar una nueva unión cada vez que desee agregar una raza a un animal. A través de este diseño simple, en realidad has hecho tu vida más difícil.

Cuando ve tipos de propiedades repetidas en una entidad, en su caso, breedID y breed2ID debería comenzar a oler algo podrido en todos, salvo en unos pocos casos excepcionales.

Bajo el diseño ideal, usted haría lo siguiente.

1.Mantenga su raza como está.

2. Haga que los animales se parezcan a algo parecido a un animal (animal_id, animal_name).

3.Agregue una nueva tabla animal_breed. Se vería como este animal_breed (animal_breed_id, animal_id, breed_id). Con animal_bread_id es un pk y una clave única activada (animal_id, breed_id) con claves externas que apuntan hacia las tablas respectivas.

Este diseño permite que un animal determinado adopte uno o más tipos de razas sin tener que meterse con su consulta para devolver las múltiples razas. Tu diseño actual se convierte en una pesadilla cada vez que tienes un animal con una raza extra. Tiene el potencial de matar el rendimiento y hacer que el mantenimiento sea una pesadilla y, además, no es un diseño de base de datos sólido.

Cuestiones relacionadas