Ver Mensaje Individual
  #2 (permalink)  
Antiguo 28/09/2011, 14:54
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: restas y sumas en resultados de busquedas

Hola iPaNiiCx:

En MySQL puedes utilizar los operadores INNER JOIN, LEFT JOIN y las condiciones EXISTS y NOT EXISTS para simular las operaciones INTERSECT y EXCEPT de SQL Server, checa estos scripts:

En SQL Server, sería más o menos así:

Código SQL:
Ver original
  1. DECLARE @Tabla1 TABLE(id INT, descripcion VARCHAR(10))
  2. INSERT INTO @Tabla1 VALUES (1, 'uno')
  3. INSERT INTO @Tabla1 VALUES (2, 'dos')
  4. INSERT INTO @Tabla1 VALUES (3, 'tres')
  5. INSERT INTO @Tabla1 VALUES (4, 'cuatro')
  6.  
  7. DECLARE @Tabla2 TABLE (id INT, descripcion VARCHAR(10))
  8. INSERT INTO @Tabla2 VALUES (3, 'tres')
  9. INSERT INTO @Tabla2 VALUES (4, 'cuatro')
  10. INSERT INTO @Tabla2 VALUES (5, 'cinco')
  11. INSERT INTO @Tabla2 VALUES (6, 'seis')
  12.  
  13. SELECT * FROM @Tabla1
  14. /*
  15. id          descripcion
  16. ----------- -----------
  17. 1           uno
  18. 2           dos
  19. 3           tres
  20. 4           cuatro
  21. */
  22. SELECT * FROM @Tabla2
  23. /*
  24. id          descripcion
  25. ----------- -----------
  26. 3           tres
  27. 4           cuatro
  28. 5           cinco
  29. 6           seis
  30. */
  31.  
  32.  
  33. /*Operador EXCEPT*/
  34. SELECT * FROM @Tabla1
  35. EXCEPT
  36. SELECT * FROM @Tabla2
  37. /*
  38. id          descripcion
  39. ----------- -----------
  40. 1           uno
  41. 2           dos
  42. */
  43.  
  44. /*Operador INTERSECT*/
  45. SELECT * FROM @Tabla1
  46. INTERSECT
  47. SELECT * FROM @Tabla2
  48. /*
  49. id          descripcion
  50. ----------- -----------
  51. 3           tres
  52. 4           cuatro
  53. */

Esto mismo puedes hacerlo en MySQL así:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE Tabla1 (id INT, descripcion VARCHAR(10));
  2. Query OK, 0 rows affected (0.14 sec)
  3.  
  4. mysql> INSERT INTO Tabla1 VALUES (1, 'uno'), (2, 'dos'),
  5.     -> (3, 'tres'), (4, 'cuatro');
  6. Query OK, 4 rows affected (0.05 sec)
  7. Records: 4  Duplicates: 0  Warnings: 0
  8.  
  9. mysql> CREATE TABLE Tabla2 (id INT, descripcion VARCHAR(10));
  10. Query OK, 0 rows affected (0.11 sec)
  11.  
  12. mysql> INSERT INTO Tabla2 VALUES (3, 'tres'), (4, 'cuatro'),
  13.     -> (5, 'cinco'), (6, 'seis');
  14. Query OK, 4 rows affected (0.03 sec)
  15. Records: 4  Duplicates: 0  Warnings: 0
  16.  
  17. mysql> SELECT * FROM Tabla1;
  18. +------+-------------+
  19. | id   | descripcion |
  20. +------+-------------+
  21. |    1 | uno         |
  22. |    2 | dos         |
  23. |    3 | tres        |
  24. |    4 | cuatro      |
  25. +------+-------------+
  26. 4 rows in set (0.01 sec)
  27.  
  28. mysql> SELECT * FROM Tabla2;
  29. +------+-------------+
  30. | id   | descripcion |
  31. +------+-------------+
  32. |    3 | tres        |
  33. |    4 | cuatro      |
  34. |    5 | cinco       |
  35. |    6 | seis        |
  36. +------+-------------+
  37. 4 rows in set (0.00 sec)
  38.  
  39. mysql> #Pasa simular el except
  40. mysql> SELECT T1.* FROM Tabla1 T1 WHERE
  41.     -> NOT EXISTS (SELECT * FROM Tabla2 T2
  42.     -> WHERE T1.id = T2.id AND T1.descripcion = T2.descripcion);
  43. +------+-------------+
  44. | id   | descripcion |
  45. +------+-------------+
  46. |    1 | uno         |
  47. |    2 | dos         |
  48. +------+-------------+
  49. 2 rows in set (0.03 sec)
  50.  
  51. mysql> #Para simular el intersect
  52. mysql> SELECT T1.* FROM Tabla1 T1
  53.     -> INNER JOIN
  54.     -> Tabla2 T2
  55.     -> ON T1.id = T2.id AND T1.descripcion = T2.descripcion;
  56. +------+-------------+
  57. | id   | descripcion |
  58. +------+-------------+
  59. |    3 | tres        |
  60. |    4 | cuatro      |
  61. +------+-------------+
  62. 2 rows in set (0.00 sec)

Sólo tienes que cuidar definir correctamente todas tus condiciones.

Saludos
Leo