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

coalesce con varios select

Estas en el tema de coalesce con varios select en el foro de Mysql en Foros del Web. Buenas! Quería saber si se puede usar la función COALESCE para evitar que una query con subconsulta devuelva NULL a causa de que la subquery ...
  #1 (permalink)  
Antiguo 29/06/2012, 07:27
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
coalesce con varios select

Buenas!
Quería saber si se puede usar la función COALESCE para evitar que una query con subconsulta devuelva NULL a causa de que la subquery devuelva un rango de valores que no encuentre la query...

Por ejemplo, si en la tabla usuario tenemos como nombres "DAVID" y "OSCAR", y en ususario2 tenemos "CARLOS" y yo ejecuto

Código:
select name
from usuario
where nombre in (select nombre
                             from usuario2)
El select no me devolvería nada porque "CARLOS" no lo encontraría en usuario... Yo lo que quiero hacer es algo como

Código:
select coalesce(
  (select name
    from usuario
    where nombre in (select nombre
                                 from usuario2)),
  (select nombre
   from usuario2)
)
Estoy probando pero no me sale, me dice que la subquery retorna más de una columna... alguna sugerencia??

Gracias!
  #2 (permalink)  
Antiguo 29/06/2012, 08:51
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: coalesce con varios select

Hola DoHITB:

A ver si entendí, lo que quiere hacer es que si en la tabla usuarios2 no existe ningún elemento igual en la tabla usuarios entonces devolver el primer registro de la tabla usuarios... Si existe algún elemento de la tabla usuarios2 en la tabla usuarios, entonces devolver esos usuario correcto??? Creo que podrías hacerlo así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM usuario;
  2. +------+--------+
  3. | id   | nombre |
  4. +------+--------+
  5. |    1 | DAVID  |
  6. |    2 | OSCAR  |
  7. +------+--------+
  8. 2 rows in set (0.00 sec)
  9.  
  10. mysql> SELECT * FROM usuario2;
  11. +------+--------+
  12. | id   | nombre |
  13. +------+--------+
  14. |    1 | CARLOS |
  15. +------+--------+
  16. 1 row in set (0.00 sec)
  17.  
  18. mysql> SELECT nombre
  19.     -> FROM usuario
  20.     -> WHERE nombre IN (SELECT nombre FROM usuario2)
  21.     -> UNION
  22.     -> (SELECT nombre
  23.     ->  FROM usuario WHERE
  24.     ->  NOT EXISTS (SELECT nombre
  25.     ->              FROM usuario
  26.     ->              WHERE nombre IN (SELECT nombre FROM usuario2))
  27.     ->  LIMIT 1);
  28. +--------+
  29. | nombre |
  30. +--------+
  31. | DAVID  |
  32. +--------+
  33. 1 row in set (0.07 sec)

Supongamos ahora que en la tabla usuarios2 existe un elemento de la tabla usuarios:

Código MySQL:
Ver original
  1. mysql> INSERT INTO usuario2 VALUES (2, 'OSCAR');
  2. Query OK, 1 row affected (0.04 sec)
  3.  
  4. mysql> SELECT * FROM usuario2;
  5. +------+--------+
  6. | id   | nombre |
  7. +------+--------+
  8. |    1 | CARLOS |
  9. |    2 | OSCAR  |
  10. +------+--------+
  11. 2 rows in set (0.00 sec)

Si ejecutamos ahora la misma consulta nos debe regresar OSCAR (en lugar de DAVID, como en el primer caso)

Código MySQL:
Ver original
  1. mysql> SELECT nombre
  2.     -> FROM usuario
  3.     -> WHERE nombre IN (SELECT nombre FROM usuario2)
  4.     -> UNION
  5.     -> (SELECT nombre
  6.     ->  FROM usuario WHERE
  7.     ->  NOT EXISTS (SELECT nombre
  8.     ->              FROM usuario
  9.     ->              WHERE nombre IN (SELECT nombre FROM usuario2))
  10.     ->  LIMIT 1);
  11. +--------+
  12. | nombre |
  13. +--------+
  14. | OSCAR  |
  15. +--------+
  16. 1 row in set (0.00 sec)

La idea de la UNION es que sólo una de las partes sea verdadera, es decir, si la primer consulta arroja resultados, entonces la segunda consulta no arroja ningún resultado y viceversa.

Igual y existe alguna otra forma más eficiente para hacer esta consulta, pues trabajar con sentencias IN y subconsultas puede ser terrible para el performance, pero acabo de llegar al trabajo y aun no me tomo mi café, así es que continuo algo dormido y el lo primero que se me ocurrió. Si encuentro una manera mejor de hacerlo la publico.

Por lo pronto dale un vistazo y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 29/06/2012, 09:21
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: coalesce con varios select

La misma idea, pero utilizando JOIN's:

Código MySQL:
Ver original
  1. mysql> SELECT u.* FROM usuario u
  2.     -> INNER JOIN
  3.     -> usuario2 u2 ON u.nombre = u2.nombre
  4.     -> UNION
  5.     -> (SELECT u.* FROM usuario u
  6.     ->  WHERE NOT EXISTS (SELECT u.* FROM usuario u
  7.     ->             INNER JOIN usuario2 u2 ON u.nombre = u2.nombre)
  8.     -> LIMIT 1);
  9. +------+--------+
  10. | id   | nombre |
  11. +------+--------+
  12. |    1 | DAVID  |
  13. +------+--------+
  14. 1 row in set (0.00 sec)

Ojalá que alguien más tenga una mejor opción.

Saludos
Leo.

Última edición por leonardo_josue; 29/06/2012 a las 09:28
  #4 (permalink)  
Antiguo 02/07/2012, 00:57
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: coalesce con varios select

Gracias por las respuestas, con la idea de que

Código:
La idea de la UNION es que sólo una de las partes sea verdadera, es decir, si la primer consulta arroja resultados, entonces la segunda consulta no arroja ningún resultado y viceversa.
me quedo, era exactamente lo que necesitaba! También usaré los join para las subquery, ya que son más óptimas que el "in".

Gracias!

Etiquetas: coalesce, select, tabla
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 18:41.