Ver Mensaje Individual
  #2 (permalink)  
Antiguo 29/06/2012, 08:51
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 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.