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

[SOLUCIONADO] Problemas con UNION ALL

Estas en el tema de Problemas con UNION ALL en el foro de Mysql en Foros del Web. Hola que tal de nuevo, tengo la siguiente consulta pero no me muestra :( me tira el siguiente error: #1248 - Every derived table must ...
  #1 (permalink)  
Antiguo 09/04/2014, 16:53
 
Fecha de Ingreso: noviembre-2011
Ubicación: Paris
Mensajes: 450
Antigüedad: 13 años
Puntos: 7
Problemas con UNION ALL

Hola que tal de nuevo, tengo la siguiente consulta pero no me muestra :( me tira el siguiente error: #1248 - Every derived table must have its own alias , segun yo esta bien, ustedes que opinan ya que trato de unir 2 tablas, saludos!

Código SQL:
Ver original
  1. SELECT * FROM (
  2. SELECT tl.idperson, tl.firstName, tl.lastName, tl.telephone, tl.degreeOfInterest, l.appointmentDate, e.firstName, i.marketability
  3. FROM `todos_los_leads` AS tl
  4. INNER JOIN leads AS l ON tl.idperson = l.idPerson
  5. INNER JOIN empleados AS e ON tl.idEmployee = e.idEmployee
  6. INNER JOIN infonavit AS i ON tl.idInfonavit = i.idInfonavit
  7. UNION ALL
  8. SELECT s.monthlyIncome
  9. FROM `todos_los_leads` AS tl
  10. INNER JOIN shf AS s ON tl.idSHF = s.idSHF
  11. )
  #2 (permalink)  
Antiguo 09/04/2014, 17:09
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: Problemas con UNION ALL

Tienes dos errores:
1) Una tabla derivada es lo que se genera cuando pones una subconsulta en el FROM de una consulta. El resultado de esa subconsulta es una tabla que deriva de ella. y Obligatoriamente, y en todos los DBMS una tabla derivada debe tener un alias. Siempre.
2) El UNION es la suma de los resultados de una consulta, con los resultados de otra, pero tienen como condición obligatoria que ambas consultas devuelvan la misma cantidad de campos en cada SELECT, del mismo tipo de columna y en el mismo orden. Nada de eso lo estás respetando en tu consulta.
Esto esta mal:
Código MySQL:
Ver original
  1.     *
  2.     (SELECT
  3.         tl.idperson,
  4.             tl.firstName,
  5.             tl.lastName,
  6.             tl.telephone,
  7.             tl.degreeOfInterest,
  8.             l.appointmentDate,
  9.             e.firstName,
  10.             i.marketability
  11.     FROM
  12.         `todos_los_leads` AS tl
  13.     INNER JOIN leads AS l ON tl.idperson = l.idPerson
  14.     INNER JOIN empleados AS e ON tl.idEmployee = e.idEmployee
  15.     INNER JOIN infonavit AS i ON tl.idInfonavit = i.idInfonavit
  16.     UNION ALL
  17.     SELECT
  18.         s.monthlyIncome
  19.     FROM
  20.         `todos_los_leads` AS tl
  21.     INNER JOIN shf AS s ON tl.idSHF = s.idSHF)
Como mínimo debería ser:
Código MySQL:
Ver original
  1.     T1.*
  2.     (SELECT
  3.         tl.idperson,
  4.             tl.firstName,
  5.             tl.lastName,
  6.             tl.telephone,
  7.             tl.degreeOfInterest,
  8.             l.appointmentDate,
  9.             e.firstName,
  10.             i.marketability
  11.     FROM
  12.         `todos_los_leads` tl
  13.     INNER JOIN leads l ON tl.idperson = l.idPerson
  14.     INNER JOIN empleados e ON tl.idEmployee = e.idEmployee
  15.     INNER JOIN infonavit i ON tl.idInfonavit = i.idInfonavit ) T1

El problema es que esta parte no encaja en la subconsulta de ninguna forma con un UNION ALL:
Código MySQL:
Ver original
  1.     SELECT s.monthlyIncome
  2.     FROM `todos_los_leads` tl
  3.     INNER JOIN shf s ON tl.idSHF = s.idSHF
¿Qué es lo que se supone que quieres vincular con ese UNION ALL?
Pregunto porque el campo "monthlyIncome" no aparece en la lista del SELECT de la primera parte de la consulta, por lo que no puedes encolumnarlo con nada.
¿Qué relación hay entre ambas partes?
__________________
¿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 09/04/2014, 17:18
 
Fecha de Ingreso: noviembre-2011
Ubicación: Paris
Mensajes: 450
Antigüedad: 13 años
Puntos: 7
Respuesta: Problemas con UNION ALL

Disculpa si existe relacion, solo que en la primera olvide ponerlo, que es lo qu puedo hacer?
  #4 (permalink)  
Antiguo 09/04/2014, 17:21
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: Problemas con UNION ALL

Cita:
Iniciado por echo_ Ver Mensaje
Disculpa si existe relacion, solo que en la primera olvide ponerlo, que es lo qu puedo hacer?
Explicarlo, porque como ya te dije, no puedes usar el UNION ALL sin que tenga la misma cantidad de columnas, del mismo tipo y el mismo orden... y eso no parece existir en tu ejemplo.
Tengo la impresión de que lo que estás intentando lograr es algo que se hace de otra forma, pero si no nos das los detalles, la estructura de las tablas y las relaciones, es difícil date una solución.
__________________
¿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 09/04/2014, 17:25
 
Fecha de Ingreso: noviembre-2011
Ubicación: Paris
Mensajes: 450
Antigüedad: 13 años
Puntos: 7
Respuesta: Problemas con UNION ALL

Muchas gracias por tu paciencia y te explico, la primera consulta que mostraste me muestra lo que quiero, pero ademas ocupo hacer otra consulta a la misma tabla pero a diferente campo ya que en la primera consulta hago referencia a:

Código MySQL:
Ver original
  1. INNER JOIN infonavit AS i ON tl.idInfonavit = i.idInfonavit

y en la segunda quiero hacer referencia a:

Código MySQL:
Ver original
  1. INNER JOIN shf AS s ON tl.idSHF = s.idSHF

de antemano se lo agradesco mucho.
  #6 (permalink)  
Antiguo 09/04/2014, 17:32
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: Problemas con UNION ALL

La pregunta que queda es: el valor de todos_los_leads.idSHF ¿Es opcional u obligatorio?
Si es obligatorio, y siempre existe, corresponde usar INNER JOIN. Si es opcional, y puede ser nulo, se debe usar LEFT JOIN.
Caso 1:
Código MySQL:
Ver original
  1.     tl.idperson,
  2.     tl.firstName,
  3.     tl.lastName,
  4.     tl.telephone,
  5.     tl.degreeOfInterest,
  6.     l.appointmentDate,
  7.     e.firstName,
  8.     i.marketability,
  9.     s.monthlyIncome
  10.     `todos_los_leads` AS tl
  11.         INNER JOIN
  12.     leads AS l ON tl.idperson = l.idPerson
  13.         INNER JOIN
  14.     empleados AS e ON tl.idEmployee = e.idEmployee
  15.         INNER JOIN
  16.     infonavit AS i ON tl.idInfonavit = i.idInfonavit
  17.         INNER JOIN
  18.     shf AS s ON tl.idSHF = s.idSHF;
Caso 2:
Código MySQL:
Ver original
  1.     tl.idperson,
  2.     tl.firstName,
  3.     tl.lastName,
  4.     tl.telephone,
  5.     tl.degreeOfInterest,
  6.     l.appointmentDate,
  7.     e.firstName,
  8.     i.marketability,
  9.     IFNULL(s.monthlyIncome, 0.0) monthlyIncome
  10.     `todos_los_leads` AS tl
  11.         INNER JOIN
  12.     leads AS l ON tl.idperson = l.idPerson
  13.         INNER JOIN
  14.     empleados AS e ON tl.idEmployee = e.idEmployee
  15.         INNER JOIN
  16.     infonavit AS i ON tl.idInfonavit = i.idInfonavit
  17.         LEFT JOIN
  18.     shf AS s ON tl.idSHF = s.idSHF
  19. WHERE TRUE OR s.monthlyIncome IS NULL;

Nota: No hace falta que uses los "AS". Son obsoletos, y lo único que hacen es ensuciar el código.

Lo que seguro NO debes usar es UNION (sea ALL o no), porque ese tiene otro uso:
Código MySQL:
Ver original
  1. SELECT a, b, c, d
  2. FROM tabla1
  3. SELECT a, b, c, d
  4. FROM tabla2;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 09/04/2014, 17:41
 
Fecha de Ingreso: noviembre-2011
Ubicación: Paris
Mensajes: 450
Antigüedad: 13 años
Puntos: 7
Respuesta: Problemas con UNION ALL

Es que en si lo que quiero es unir 2 tablas mira:
1. Tengo la tabla "Todos los leads" que tiene 2 llaves primarias las cuales son:
-idInfonavit
-idSHF
2. Tengo otras 2 tablas: Infonavit y SHF
3. Ocupo el idIfonavit de mi tabla "Todos los leads" para sacar un monto de la tabla "Infonavit"
4. Ocupo el idSHF de mi tabla "Todos los leads" para acceder a otro monto de mi tabla "SHF"
5. "monthlyIncome" es el nombre de la columna que quiero mostrar, infonavit y SHF las contienen.

Lo estoy haciendo asi pero no me tira nada, a excepcion de que le quite la ultima linea:
Código MySQL:
Ver original
  1. SELECT tl.idperson, tl.firstName, tl.lastName, tl.telephone, tl.degreeOfInterest, l.appointmentDate, e.firstName, i.marketability, s.monthlyIncome
  2. FROM `todos_los_leads` AS tl
  3. INNER JOIN leads AS l ON tl.idperson = l.idPerson
  4. INNER JOIN empleados AS e ON tl.idEmployee = e.idEmployee
  5. INNER JOIN infonavit AS i ON tl.idInfonavit = i.idInfonavit
  6. INNER JOIN shf AS s ON tl.idSHF = s.idSHF
  #8 (permalink)  
Antiguo 09/04/2014, 18:06
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: Problemas con UNION ALL

No nos estás dando suficiente información para entender qué representa esa columna...
¿No puedes o no quieres explicar qué representan las tablas y lo que guardas?
Básicamente sigue sin entenderse la relación entre las tablas y su cardinalidad, así como la mandatoriedad de esas relaciones.
Cita:
5. "monthlyIncome" es el nombre de la columna que quiero mostrar, infonavit y SHF las contienen.
Si la contienen las dos tablas, como dices, ¿por qué no aparece en esta parte:
Código MySQL:
Ver original
  1.     tl.idperson, tl.firstName, tl.lastName, tl.telephone,
  2.     tl.degreeOfInterest, l.appointmentDate, e.firstName, i.marketability

Además de esto, ¿probaste el caso 2 que te puse?
Tengo la impresión de que NO LO HICISTE:

Para intentar entender lo que tienes, ¿qué devuelve esto?:
Código MySQL:
Ver original
  1.     tl.idperson, tl.firstName,
  2.     tl.lastName,
  3.     tl.telephone,
  4.     tl.degreeOfInterest,
  5.     i.marketability,
  6.     s.monthlyIncome
  7.     `todos_los_leads` tl
  8.         INNER JOIN
  9.     infonavit AS i ON tl.idInfonavit = i.idInfonavit
  10.         INNER JOIN
  11.     shf AS s ON tl.idSHF = s.idSHF;
¿Devuelve registros?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 09/04/2014, 18:15
 
Fecha de Ingreso: noviembre-2011
Ubicación: Paris
Mensajes: 450
Antigüedad: 13 años
Puntos: 7
Respuesta: Problemas con UNION ALL

Me sale columnas vacias, yo lo intento hacer asi:
Código MySQL:
Ver original
  1. SELECT tl.idperson, tl.firstName, tl.lastName, tl.telephone, tl.degreeOfInterest, l.appointmentDate, e.firstName, i.marketability
  2.   FROM `todos_los_leads` AS tl
  3.   INNER JOIN leads AS l ON tl.idperson = l.idPerson
  4.   INNER JOIN empleados AS e ON tl.idEmployee = e.idEmployee
  5.   INNER JOIN infonavit AS i ON tl.idInfonavit = i.idInfonavit
  6.   SELECT s.monthlyIncome
  7.   FROM `todos_los_leads` AS tl
  8.   INNER JOIN shf AS s ON tl.idSHF = s.idSHF

En todos los leads guardo:
Código SQL:
Ver original
  1. idperson,firstName,lastName,middleName,email,address1,address2,colony,city,idState,zipcode,telephone,cellphone,otherphone,active,idEmployee,idEmployeeCSR,company,LENGTH,POSITION,gender,ssn,maritalStatus,kids,birthDate,createdDate,idFlag,spouse,needFinancing,idMarketingSource,idAccountGroup,idLeadClass,idDistributionChannel,idCustomerClass,idIncomeClass,idProfessionClass,idSalesZone,idTitle,comments,idCommunicationClass,infonavitQualify,visitCount,sessionId,idPersonContact,idEmployeeCSRLead,idEmployeeCSRPostSale,curp,idInfonavit,idSHF,appliesFOVISSSTE,leadType,companyVisited,idCampaing,degreeOfInterest,reallocations,lastAssignment,idBranch,idBranchLead,hasExtras,idEmployeeCSRTitration,idBranchTitration,degreeOfInterestChangedDate,idBranchPostSale,idPersonSAP,idSellersGroup,idNotQualifyReason,idcreditBureau,preQualification,infoLastUpdated,idEmployeeCSRTelemarketing,creditNumber,isSubsidy,folio

En infonavit:
Código SQL:
Ver original
  1. idInfonavit,qualifies,credit,ssv,marketability,expectedDate

Y en SHF:
Código SQL:
Ver original
  1. idSHF,TYPE,monthlyIncome,saveDate1,saveDate2,saveDate3,saveDate4,saveDate5,saveDate6

Última edición por gnzsoloyo; 09/04/2014 a las 18:49
  #10 (permalink)  
Antiguo 09/04/2014, 18:39
 
Fecha de Ingreso: noviembre-2011
Ubicación: Paris
Mensajes: 450
Antigüedad: 13 años
Puntos: 7
Respuesta: Problemas con UNION ALL

Esto es lo que buscaba, de antemano, gracias
Código MySQL:
Ver original
  1. SELECT tl.idperson, tl.firstName, tl.lastName, tl.telephone, tl.degreeOfInterest, l.appointmentDate, e.firstName, i.marketability
  2.   FROM `todos_los_leads` AS tl
  3.   INNER JOIN leads AS l ON tl.idperson = l.idPerson
  4.   INNER JOIN empleados AS e ON tl.idEmployee = e.idEmployee
  5.   INNER JOIN infonavit AS i ON tl.idInfonavit = i.idInfonavit
  6.   SELECT tl.idperson, tl.firstName, tl.lastName, tl.telephone, tl.degreeOfInterest, l.appointmentDate, e.firstName, s.monthlyIncome
  7.   FROM `todos_los_leads` AS tl
  8.   INNER JOIN leads AS l ON tl.idperson = l.idPerson
  9.   INNER JOIN empleados AS e ON tl.idEmployee = e.idEmployee
  10.   INNER JOIN shf AS s ON tl.idSHF = s.idSHF

Etiquetas: join, select, tabla, union
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 05:00.