Ver Mensaje Individual
  #5 (permalink)  
Antiguo 19/03/2013, 12:28
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: Consulta multiples tablas

Hola Killerx_8937:

Vayamos por partes para resolver tus dudas:

Cita:
aqui va mi consulta al intentar usar using me di cuenta que los campos relacionados deben tener el mismo nombre o no?
USING(Equipos_Codigo)

Efectivamente, cuando utilizas USING el campo se debe llamar igual en las dos tablas que intentas unir, (de hecho es una buena práctica de SQL llamara a las llaves foráneas de la misma manera que sus llaves a las que hacen referencia, pero en realidad esas es una forma de ahorrar código... Tu puedes especificar el nombre de tus campos sin ningún problema. Checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +---------+-------------+
  13. | otro_id | descripcion |
  14. +---------+-------------+
  15. |       1 | uno         |
  16. |       2 | two         |
  17. +---------+-------------+
  18. 2 rows in set (0.00 sec)

observa que el campo llave no tiene el mismo nombre, por lo tanto tú puedes hacer la unión especificando los nombres de cada tabla, así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1 LEFT JOIN tabla2 ON tabla1.id = tabla2.otro_id;
  2. +------+-------------+---------+-------------+
  3. | id   | descripcion | otro_id | descripcion |
  4. +------+-------------+---------+-------------+
  5. |    1 | uno         |       1 | uno         |
  6. |    2 | dos         |       2 | two         |
  7. |    3 | tres        |    NULL | NULL        |
  8. +------+-------------+---------+-------------+
  9. 3 rows in set (0.00 sec)

En otras palabras

Código:
USING(Equipos_Codigo)

es una abreviación de 

tabla1.Equipos_Codigo = tabla2.Equipos_Codigo

Por lo tanto, no es indispensable que el campo se llame igual en tus tablas. Ahora bien siguiendo con tu problema. Te comentaba que para saber si un registro esta en una tabla pero no en otra lo podías hacer de tres maneras distintas... Con LEFT JOIN, con NOT EXISTS y con NOT IN. Veamos cada caso...

Supongamos que te interesa saber qué id's de tu tabla1 no están en tu tabla2, podrías hacerlo así:

CON LEFT JOIN:

Código MySQL:
Ver original
  1. mysql> SELECT tabla1.* FROM tabla1
  2.     -> LEFT JOIN tabla2 ON tabla1.id = tabla2.otro_id
  3.     -> WHERE tabla2.otro_id IS NULL;
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    3 | tres        |
  8. +------+-------------+
  9. 1 row in set (0.00 sec)

CON NOT IN:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1 WHERE id NOT IN (SELECT otro_id FROM tabla2);
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    3 | tres        |
  6. +------+-------------+
  7. 1 row in set (0.00 sec)

CON NOT EXISTS:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1
  2.     -> WHERE NOT EXISTS (SELECT otro_id FROM tabla2
  3.     ->                   WHERE tabla1.id = tabla2.otro_id);
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    3 | tres        |
  8. +------+-------------+
  9. 1 row in set (0.00 sec)

La principal diferencia entre los métodos es la posibilidad de comparar contra más de un campo. NOT IN SÓLO TE PERMITE COMPARAR UN CAMPO A LA VEZ, en este caso el id, pero observa que la descripción de la tabla2 para el id=2 no es la misma... Si quisieras comparar por ambos campos NO PODRÍAS HACERLO CON NOT IN... pero si podrías hacerlo con el LEFT JOIN y con el NOT EXISTS:

CON EL LEFT JOIN:

Código MySQL:
Ver original
  1. mysql> SELECT tabla1.* FROM tabla1
  2.     -> LEFT JOIN tabla2 ON tabla1.id = tabla2.otro_id AND
  3.     ->           tabla1.descripcion = tabla2.descripcion
  4.     -> WHERE tabla2.otro_id IS NULL;
  5. +------+-------------+
  6. | id   | descripcion |
  7. +------+-------------+
  8. |    2 | dos         |
  9. |    3 | tres        |
  10. +------+-------------+
  11. 2 rows in set (0.00 sec)

CON EL NOT EXISTS:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1
  2.     -> WHERE NOT EXISTS (SELECT otro_id FROM tabla2
  3.     ->                   WHERE tabla1.id = tabla2.otro_id AND
  4.     ->                         tabla1.descripcion = tabla2.descripcion);
  5. +------+-------------+
  6. | id   | descripcion |
  7. +------+-------------+
  8. |    2 | dos         |
  9. |    3 | tres        |
  10. +------+-------------+
  11. 2 rows in set (0.00 sec)

Observa que en estos dos casos también se lista el registro (id=2, descripcion='dos') porque en la tabla2 existe el mismo id, PERO NO TIENE LA MISMA DESCRIPCIÓN.

Saludos
Leo.