¿Cómo evito mostrar columnas repetidas?

Iniciado por DanteInfernum, 15 Septiembre 2013, 20:30 PM

0 Miembros y 1 Visitante están viendo este tema.

DanteInfernum

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).

Shell Root

GROUP BY? Porque pertenece a las 2 tablas, no entiendo... Podrias mostrar el resultado a ver como se ven los datos?
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

DanteInfernum

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...

Shell Root

Basicamente,
Código (sql) [Seleccionar]
     SELECT emp.*, tra.IdCargo, tra.IdSeccion
       FROM empleados emp
 INNER JOIN trabajan tra ON empleados.idemp = trabajan.idemp
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

DanteInfernum

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:

Código (sql) [Seleccionar]

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.

Shell Root

Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

1mpuls0

#6
No conozco alguna instrucción que haga eso, me temo que tendrás que indicarlas.

Edito:
Algo que se acerque puede ser.

Código (sql) [Seleccionar]

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
Código (sql) [Seleccionar]

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)


Código (sql) [Seleccionar]

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)


Código (sql) [Seleccionar]

mysql> SELECT @sql;
+----------------------------------------+
| @sql                                   |
+----------------------------------------+
| SELECT category_owner_id FROM products |
+----------------------------------------+
1 row in set (0.00 sec)


Saludos.
abc

#!drvy

Creo que USING fue creado precisamente para estas cosas xD

Código (SQL) [Seleccionar]
SELECT * FROM empleados INNER JOIN trabajan USING (idEmp)



Saludos

1mpuls0

#8
Cita de: drvy en 23 Septiembre 2013, 20:20 PM
Creo que USING fue creado precisamente para estas cosas xD

Código (SQL) [Seleccionar]
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.
abc

DanteInfernum

¿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.