Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

[SOLUCIONADO] Hacer and dos veces en el mismo campo de una tabla relacional

Estas en el tema de Hacer and dos veces en el mismo campo de una tabla relacional en el foro de Bases de Datos General en Foros del Web. Saludos! Tengo una duda sobre como hacer un and del mismo campo de una tabla relacionada, por ejemplo tengo la tabla personas y licencias, como ...
  #1 (permalink)  
Antiguo 22/11/2014, 14:09
Avatar de felipelvrd  
Fecha de Ingreso: diciembre-2012
Mensajes: 28
Antigüedad: 11 años, 11 meses
Puntos: 0
Hacer and dos veces en el mismo campo de una tabla relacional

Saludos!
Tengo una duda sobre como hacer un and del mismo campo de una tabla relacionada, por ejemplo tengo la tabla personas y licencias, como algo así:

Personas(Id, Nombre);
Licencias(Id, IdPersona, Tipo);

Si por ejemplo quiero seleccionar las personas que tengan el tipo de licencia X y Y como lo hago?

Yo siempre lo he hecho con un doble join a la misma tabla de esta forma:

Código SQL:
Ver original
  1. SELECT *
  2. FROM Personas p
  3. JOIN Licencias l ON l.idPersona = p.Id
  4. JOIN Licencias c ON c.idPersona = p.Id
  5. WHERE l.Tipo =  'X'
  6. AND c.Tipo =  'Y'
[/CODE]

Pero me preguntaba si existe alguna forma más sencilla de hacerlo o si como lo hago esta bien?

Última edición por gnzsoloyo; 22/11/2014 a las 14:24
  #2 (permalink)  
Antiguo 22/11/2014, 14:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Hacer and dos veces en el mismo campo de una tabla relacional

Cita:
Si por ejemplo quiero seleccionar las personas que tengan el tipo de licencia X y Y como lo hago?
En el contexto de tu caso, la doble invocación a la misma tablas es innecesaria, ya que se resuelve con un OR, o un IN().
Entendamos claramente cómo funciona un OR: Es verdadero cuando una de las dos proposiciones es TRUE, o cuando son TRUE las dos.
En consecuencia hay dos formas de hacerlo:
Código SQL:
Ver original
  1. SELECT *
  2. FROM Personas p INNER JOIN Licencias l ON l.idPersona = p.Id
  3. WHERE l.Tipo = 'X' OR  l.Tipo ='Y'
o bien esta:
Código SQL:
Ver original
  1. SELECT *
  2. FROM Personas p INNER JOIN Licencias l ON l.idPersona = p.Id
  3. WHERE l.Tipo IN( 'X', 'Y')
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 22/11/2014, 15:18
Avatar de felipelvrd  
Fecha de Ingreso: diciembre-2012
Mensajes: 28
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Hacer and dos veces en el mismo campo de una tabla relacional

or no me sirve, porque muestra también las personas que solo tienen X y las que solo tiene Y, yo necesito que muestre solo los que tienen X y Y, y con in pasa lo mismo.
  #4 (permalink)  
Antiguo 22/11/2014, 17:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Hacer and dos veces en el mismo campo de una tabla relacional

Pues para eso tampoco es necesario hacer una consulta compleja...
Código SQL:
Ver original
  1. SELECT *
  2. FROM Personas p INNER JOIN Licencias l ON l.idPersona = p.Id
  3. WHERE p.Id IN (
  4.     SELECT id_persona
  5.     FROM Licencias
  6.     WHERE Tipo IN ('X', 'Y')
  7.     GROUP BY id_persona
  8.     HAVING COUNT(*) = 2)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 22/11/2014, 19:51
Avatar de felipelvrd  
Fecha de Ingreso: diciembre-2012
Mensajes: 28
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Hacer and dos veces en el mismo campo de una tabla relacional

no lo había pensado de esa forma, al final modifiqué un poco la consulta para evitar la consulta anidada y me ha quedado así:

Código SQL:
Ver original
  1. SELECT p.*
  2. FROM Personas p INNER JOIN Licencias l ON l.idPersona = p.Id
  3. WHERE l.Tipo IN ('X', 'Y')
  4. GROUP BY p.id
  5. HAVING COUNT(l.id) = 2

que es justo lo que necesito, así que solucionado el tema.
Gracias, tenia como un año de no tocar SQL

Etiquetas: join, sql, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:25.