SQL - No distinguir por una columna.

   
Vista:
Imágen de perfil de Jhonnathan Emilio Cardona Saineda

No distinguir por una columna.

Publicado por Jhonnathan Emilio Cardona Saineda (2 intervenciones) el 05/07/2013 00:24:32
Hola compañeros, muchas gracias por leer el mensaje.
Mi problema es que estoy haciendo una consulta pero el resultado no puede estar repetido por lo que utilizo DISTINCT el problema es que me toca seleccionar el primer registro de un campo que es diferente por lo que no quisiera distinguir este campo Ejemplo. consulta y resultado de la consulta.

Select distinct nombre, identificacion, campo from Area;

resultado

nombre identificación campo
------------------------------------------
ABA 4 123
ABA 4 111
ABA 4 222



RESULTADO ESPERADO --> lo que quiero es que no se repita y me muestre el 1er registro de campo EJ.

ABA 4 123

Como puedo hacer esta consulta.
Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

No distinguir por una columna.

Publicado por leonardo_josue (877 intervenciones) el 05/07/2013 18:12:21
Hola Jhonnathan:

En primer lugar, hay que entender cómo funciona el operador DISTINCT... no nos dices con qué Base de Datos estás trabajando, pero en realidad se trata de SQL Estandar. El operador DISTINCT sirve para eliminar REGISTROS DUPLICADOS... donde un registro duplicado es aquel en donde TODAS SUS COLUMNAS tienen el mismo valor. Si uno solo de los campos tienen un valor distinto, entonces NO SE TRATA DE UNA COLUMNA DUPLICADA.

Observa este ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM tabla;
+--------+----------------+-------+
| nombre | identificacion | campo |
+--------+----------------+-------+
| ABA    |              4 |   123 |
| ABA    |              4 |   111 |
| ABA    |              4 |   222 |
| ABA    |              4 |   123 |
| ABA    |              4 |   111 |
| ABA    |              4 |   123 |
+--------+----------------+-------+
6 rows in set (0.00 sec)


La tabla original tiene 6 registros, donde algunos registros si se encuentran duplicados... si hago un DISTINCT sobre todos los campos, observa el resultado:

1
2
3
4
5
6
7
8
9
mysql> SELECT DISTINCT nombre, identificacion, campo FROM tabla;
+--------+----------------+-------+
| nombre | identificacion | campo |
+--------+----------------+-------+
| ABA    |              4 |   123 |
| ABA    |              4 |   111 |
| ABA    |              4 |   222 |
+--------+----------------+-------+
3 rows in set (0.00 sec)


Observa que la consulta presenta sólo tres registros, que no son repetidos porque tienen un valor distinto en el campo CAMPO.

Si sólo consideraras el NOMBRE o la IDENTIFICACION, entonces sí presentaría sólo un registro,
porque en este caso, TODOS LOS REGISTROS SON IGUALES;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> SELECT nombre, identificacion FROM tabla;
+--------+----------------+
| nombre | identificacion |
+--------+----------------+
| ABA    |              4 |
| ABA    |              4 |
| ABA    |              4 |
| ABA    |              4 |
| ABA    |              4 |
| ABA    |              4 |
+--------+----------------+
6 rows in set (0.00 sec)
 
mysql> SELECT DISTINCT nombre, identificacion FROM tabla;
+--------+----------------+
| nombre | identificacion |
+--------+----------------+
| ABA    |              4 |
+--------+----------------+
1 row in set (0.00 sec)


Ahora bien, para resolver tu consulta, depende mucho de la BD que estás utilizando... por ejemplo, con MySQL podrías agrupar... es decir, hacer esto:

1
2
3
4
5
6
7
mysql> SELECT nombre, identificacion, campo FROM tabla GROUP BY nombre;
+--------+----------------+-------+
| nombre | identificacion | campo |
+--------+----------------+-------+
| ABA    |              4 |   123 |
+--------+----------------+-------+
1 row in set (0.00 sec)


Este te presentaría el resultado que quieres, pero no todos los DBMS te permiten seleccionar campos sin agrupar. (observa que en el SELECT obtengo tres campos, pero en el GROUP BY sólo coloco el nombre)... eso en realidad no forma parte del estandar de SQL, por lo que no todas las BD te permiten hacerlo. Haz la prueba para ver si funciona, y si continuas con problemas dinos con qué estás trabajando y te ayudamos a encontrar alguna otra alternativa.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhonnathan Emilio Cardona Saineda

No distinguir por una columna.

Publicado por Jhonnathan Emilio Cardona Saineda (2 intervenciones) el 05/07/2013 21:57:01
Hola leonardo, Muchas gracias por la gran explicación. Me ha quedado muy claro y pues ya había hecho el intento con el group by pero me salia un problema y luego descubrí que los campos que se colocan en el group by tienen que ser los mismo que se están seleccionando por lo que tampoco me sirvió. La solución que tengo por ahora es dos consultas separadas. Muchas gracias por tu tiempo. Haa y estoy utilizando Oracle como DBMS. Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No distinguir por una columna.

Publicado por leonardo_josue (877 intervenciones) el 05/07/2013 23:10:23
Es a lo que me refería al decirte que la solución dependía de la BD que estás utilizando... Utilizando Oracle en realidad tienes también otras alternativas además de hacerlo con consultas separadas.. por ejemplo, puedes utilizar la función ROW_NUMBER para enumerar los registros y traer solo el primero... esta sería la opción más sencilla desde mi punto de vista.

En fin, me alegra que hayas encontrado la solución por tu cuenta.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar