El asunto es así:
Tengo 2 tablas, Empleados y Trabajan. La columna IdEmp es clave primaria de Empleados y a su vez clave foránea de Trabajan. Quiero componer las dos tablas mediante un inner join y mostrar todos los datos resultantes.
Tengo la siguiente consulta en SQL:
select *
from empleados inner join trabajan
on empleados.idemp = trabajan.idemp
La cuestión es que IdEmp pertenece a las 2 tablas, por lo que al mostrar todos los datos esta columna se repite. Me gustaría saber qué puedo hacer para evitar esto (sin tener que seleccionar las columnas que quiero mostrar una por una).
GROUP BY (http://dev.mysql.com/doc/refman/5.0/es/group-by-modifiers.html)? Porque pertenece a las 2 tablas, no entiendo... Podrias mostrar el resultado a ver como se ven los datos?
Después de hacer un inner join entre las tablas Empleados y Trabajan, muestro todos los campos, y me queda algo así:
IdEmp Nombre Apellido Direccion IdEmp IdCargo IdSeccion
IdEmp pertenece a la tabla Empleados y también a la tabla Trabajan. Por eso se muestra dos veces. Y lo que quería saber es si existe alguna forma de mostrar la columna IdEmp una sola vez.
El Group By tengo entendido que sólo sirve cuando tengo funciones de agregación como lo son SUM(), COUNT(), etc. Pero no sé, capaz que sirve para más cosas también...
Basicamente,
SELECT emp.*, tra.IdCargo, tra.IdSeccion
FROM empleados emp
INNER JOIN trabajan tra ON empleados.idemp = trabajan.idemp
Mmm... Ok, pero de esa forma estoy detallando explícitamente las columnas de la tabla Trabajan que quiero que aparezcan, que es justo lo que quería evitar.
Pero sí, parece que no hay otra forma. O indicas todas las columnas que quieras mostrar una por una, o las seleccionas TODAS con *. No existe algo así como:
Select * except(columnaX)
Talvez se pueda solucionar esto creando un procedimiento que te busque una determinada columna y la elimine, pero recién estoy empezando con el tema de los scripts en SQL y no lo tengo muy claro aún todo este asunto.
Muchas gracias por las respuestas!
Saludos.
:http://es.softuses.com/81643
No conozco alguna instrucción que haga eso, me temo que tendrás que indicarlas.
Edito:
Algo que se acerque puede ser.
SELECT empleados.*, trabajan.IdCargo, trabajan.IdSeccion, trabajan.IdTrab FROM empleados
INNER JOIN trabajan ON empleados.IdEmp=trabajan.IdEmp
Encontré esto... a ver si te sirve.
Estructura
mysql> SHOW FIELDS FROM products;
+-------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| category_id | int(11) | YES | | NULL | |
| owner_id | int(11) | YES | | NULL | |
+-------------+---------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'id,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'products' AND TABLE_SCHEMA = 'ehn'), ' FROM products');
Query OK, 0 rows affected (0.03 sec)
mysql> SELECT @sql;
+----------------------------------------+
| @sql |
+----------------------------------------+
| SELECT category_owner_id FROM products |
+----------------------------------------+
1 row in set (0.00 sec)
Saludos.
Creo que USING fue creado precisamente para estas cosas xD
SELECT * FROM empleados INNER JOIN trabajan USING (idEmp)
(http://i.elhacker.net/i?i=QtlnxgJ6CciNdbazntf3UmVo) (http://i.elhacker.net/d?i=QtlnxgJ6CciNdbazntf3UmVo)
Saludos
Cita de: drvy en 23 Septiembre 2013, 20:20 PM
Creo que USING fue creado precisamente para estas cosas xD
SELECT * FROM empleados INNER JOIN trabajan USING (idEmp)
Genial. ;-) creo que le servirá.
Aunque tengo entendido que con esa función debe existir el campo en ambas tablas y por ende solo funciona con * JOIN.
Saludos.
¿La cláusula USING es propia de MySQL, no? Lo que pasa que yo estoy usando SQL Server. Igual está bueno el dato; me sirve a futuro.