Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

2 Consultas a 1 sobre la misma Tabla

Estas en el tema de 2 Consultas a 1 sobre la misma Tabla en el foro de Bases de Datos General en Foros del Web. Hola, Estoy construyendo una consulta, pero me sale en 2, tengo la siguiente Tabla: idTabla int Grupo varchar(500) Igualdad varchar(200) Donde el campo Igauldad se ...
  #1 (permalink)  
Antiguo 12/07/2010, 07:57
Avatar de gakutaru  
Fecha de Ingreso: agosto-2005
Ubicación: frente a mi NtbK
Mensajes: 239
Antigüedad: 18 años, 8 meses
Puntos: 6
2 Consultas a 1 sobre la misma Tabla

Hola, Estoy construyendo una consulta, pero me sale en 2,
tengo la siguiente Tabla:

idTabla int
Grupo varchar(500)
Igualdad varchar(200)

Donde el campo Igauldad se puede repetir, por ejemplo:
IdTabla-Grupo---Igualdad
4------13------201079192130359
5------155-----201079192130359
6------157-----201079192130359
7------43------201079192130359
8------44------2010710121317120
9------13------2010710121317120
10-----155-----2010710121317120
11-----44------2010710125131670
12-----13------201071013011157
13-----44------2010710131218840
14-----13------2010710131949260
15-----44------2010710132348120
16-----44------2010710132418390

la idea es seleccionar los valores que no se repiten del campo"Igualdad", por lo que uso la funcion 'Distinct" asi "Select Distinct Igualdad From Tabla" y efectivamente devuelve los valores unicos, pero ademas necesito el resto de los campos como el Grupo y La tabla. pero no me sale bien pense en " Select * From Tabla Where (Igualdad = (Select Distinct Igualdad From Tabla))" pero eso es devuelve un error, por que el select dentro del Where se ejecuta y devuelve varios valores (La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión. )
Entonces, no se me ocurre para hacer que devuelva los valores no repetidos de Igualdad, pero que muestre todos los campos si es que no lo hago en dos Consultas. Se puede? alguna idea
  #2 (permalink)  
Antiguo 12/07/2010, 08:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: 2 Consultas a 1 sobre la misma Tabla

DISTINCT opera sobre el registro completo y no sobre un único campo. Pero aquí tienes un problema doble: SI bien es fácil obtener un único valor basado en la columna "Igualdad", las otras dos tienen diferentes valores.
¿Cuáles de esos valores quieres?, porque no dices que no quieres repeticiones de "Igualdad"...

Esto es importante, porque dependiendo de qué orden se les de a esos valores, será el registro que queda:
Caso 1:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM tabla t
  3.     -> GROUP BY Igualdad;
  4. +---------+-------+------------------+
  5. | IdTabla | Grupo | Igualdad         |
  6. +---------+-------+------------------+
  7. |       8 |    44 | 2010710121317120 |
  8. |      11 |    44 | 2010710125131670 |
  9. |      12 |    13 | 201071013011157  |
  10. |      13 |    44 | 2010710131218840 |
  11. |      14 |    13 | 2010710131949260 |
  12. |      15 |    44 | 2010710132348120 |
  13. |      16 |    44 | 2010710132418390 |
  14. |       4 |    13 | 201079192130359  |
  15. +---------+-------+------------------+
  16. 8 rows in set (0.00 sec)

Caso 2:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM (SELECT *
  3.     ->   FROM tabla t
  4.     ->   ORDER BY Grupo DESC) T1
  5.     -> GROUP BY Igualdad;
  6. +---------+-------+------------------+
  7. | IdTabla | Grupo | Igualdad         |
  8. +---------+-------+------------------+
  9. |      10 |   155 | 2010710121317120 |
  10. |      11 |    44 | 2010710125131670 |
  11. |      12 |    13 | 201071013011157  |
  12. |      13 |    44 | 2010710131218840 |
  13. |      14 |    13 | 2010710131949260 |
  14. |      15 |    44 | 2010710132348120 |
  15. |      16 |    44 | 2010710132418390 |
  16. |       6 |   157 | 201079192130359  |
  17. +---------+-------+------------------+
  18. 8 rows in set (0.00 sec)

Como puedes ver, los resultados son diferentes.


Tips:

¿Por qué usas campos tan grandes, innecesariamente.?

Si el grupo es un valor numérico, como aparece en la lista, ¿por qué lo defines como VARCHAR?

¿Por qué usas un VARCHAR para guardar un valor de fecha y hora? Corresponde usar DATETIME o TIMESTAMP, ahorras espacio y ganas en eficiencia de consultas.

Esta sería una estructura más razonable:
Código MySQL:
Ver original
  1. DROP TABLE IF EXISTS `tabla`;
  2. CREATE TABLE  `tabla` (
  3.   `IdTabla` int(11) NOT NULL auto_increment,
  4.   `Grupo` int(11) NOT NULL,
  5.   `Igualdad` varchar(20) NOT NULL,
  6.   PRIMARY KEY  (`IdTabla`)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/07/2010, 08:42
Avatar de gakutaru  
Fecha de Ingreso: agosto-2005
Ubicación: frente a mi NtbK
Mensajes: 239
Antigüedad: 18 años, 8 meses
Puntos: 6
Respuesta: 2 Consultas a 1 sobre la misma Tabla

Porque valores tan grandes?
Cuando cree la BD, pense que guardaria el campo completo y no solo el ID, y el campo Iguadad no es fecha puesto que es un Id que genero en base al momento en que se genera el insert, necesitaba generar un id unico pero que se repitiera, por eso ocupe la fecha, ya que es siempre distinto al momento de crearse, pero ya que lo mensionas, cambiare los tipos por algo mas adecuado, aun estoy en diseño.

Que valor necesito?
el primero que encuentre, por ejemplo
Da lo mismo si encuentra primero el registro:
4------13------201079192130359
o si encuentra primero el registro
7------43------201079192130359
para este caso, manda el campo Igualdad.
aun asi deben ser diferentes, ya que en el futuro, podrian editar los campos y el campo igualdad seria cambiado, dividiendo a la agrupacion de Igualdad.
  #4 (permalink)  
Antiguo 12/07/2010, 10:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: 2 Consultas a 1 sobre la misma Tabla

Cita:
Cuando cree la BD, pense que guardaria el campo completo y no solo el ID, y el campo Iguadad no es fecha puesto que es un Id que genero en base al momento en que se genera el insert, necesitaba generar un id unico pero que se repitiera, por eso ocupe la fecha, ya que es siempre distinto al momento de crearse, pero ya que lo mensionas, cambiare los tipos por algo mas adecuado, aun estoy en diseño.
Bueno, hay varias formas más de lograr un ID único. En todo caso siempre es bueno usar mejor un BIGINT si lo piensas crear como número, porque con 8 bytes tienes 18.446.744.073.709.551.615 combinaciones posibles.
Si eso no te conforma, es mejor atenerse al modelo relacional y establecer mejor la PK, ya que al crearla sobre más de un campo puedes hacer consultas más eficientes, y si eso no sirve hay una función que te crea un identificador único sobre la base de un patrón alfanumérico de varias secciones que sí es irrepetible...
Cita:
Que valor necesito?
el primero que encuentre, por ejemplo
Da lo mismo si encuentra primero el registro:
4------13------201079192130359
o si encuentra primero el registro
7------43------201079192130359
para este caso, manda el campo Igualdad.
aun asi deben ser diferentes, ya que en el futuro, podrian editar los campos y el campo igualdad seria cambiado, dividiendo a la agrupacion de Igualdad.
Bueno, esto requiere que expliques un poco mejor en qué consiste todo, porque así será más fácil sugerirte soluciones.
De cualquier forma, se infiere que uno de los valores de la tabla es el grupo, y que se puede hacer reasignaciones. Eso me da la idea de que podemos definir una clave en esa tabla sin andar "inventando" identificadores únicos.
Pero para eso habría que ver mejor el modelo.
¿has hecho algún diagrama del modelo de datos de esa parte que puedas postear?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 12/07/2010, 13:09
Avatar de gakutaru  
Fecha de Ingreso: agosto-2005
Ubicación: frente a mi NtbK
Mensajes: 239
Antigüedad: 18 años, 8 meses
Puntos: 6
Respuesta: 2 Consultas a 1 sobre la misma Tabla

si puedo mostrarte esa parte del diagrama, no puedo subir imagenes desde aqui, asi que a puros caracteres ;)

BcoPregunta
idBco----------int
Pregunta----------nvarchar(MAX)
TipoRespuesta----------varchar(100)
Dimension----------varchar(100)
Grupo----------int
Imagen----------varchar(500)
Igualdad----------varchar(200)

Respuesta
idRespuesta---------int
idBco---------int
Respuesta---------nvarchar(MAX)
Correcta---------varchar(50)

breve explicacion, bcoPregunta guarda las preguntas y Respuesta guarda las respuestas de esa pregunta, las preguntas son NRespuestas,1 Correcta; Orden donde el campo respuesta guarda texto enriquesido (al igual que el campo pregunta) y el campo Correcta guarda la respuesta que debe ir.
Estas preguntas son asignadas a un grupo, si la pregunta es ingresada a varios grupos al mismo tiempo, quiere decir que comparten la misma pregunta, para efecto de edicion de una pregunta, se creo el campo igualdad, asi si editan una pregunta, aquellas en donde coincida el campo igualdad tambien sera editada la pregunta.

Ahora bien esto es SQL Server 2005 con VB.NET, la consulta que estoy armando es para llenar un datagrid, (eso lo se hacer) el problema es que hacerlo en 2 consultas es un desgaste porque trato de listar las preguntas que hay,
la logica es mas menos la siguiente

Mientras Recorre campos Igualdad Sin repetir{
Muestro Pregunta
Muestro TipoRespuesta
Muestro Dimension
Muestro Imagen
} //Fin Mientras Recorre campos Igualdad Sin repetir


pero como es en dos consultas

Mientras Recorre campos Igualdad Sin repetir{
Leo Todos los Datos{
Muestro Pregunta
Muestro TipoRespuesta
Muestro Dimension
Muestro Imagen
}//fin leer datos
}//fin mientras recorre


y no se si se nota que se puede mejorar esa consulta que esta hecha en 2 a solo 1 ya que es la misma tabla
PD: en ningun momento llamo a la Tabla Respuesta, no necesito saber sus respuestas ahora.

las combinaciones que he probado:
"Select * From BcoPregunta Where (Count(Igualdad) = 1)"
Error devuelto: No puede aparecer un agregado en la cláusula WHERE si no es en una subconsulta contenida en una cláusula HAVING o en una lista de selección, y siempre que la columna agregada sea una referencia externa.
(Pero Count no va en Where)

"Select * From BcoPregunta Group By Igualdad"
Error devuelto: La columna 'BcoPregunta.idBco' de la lista de selección no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.
(Pero, GROUP BY se utiliza cuando estamos seleccionado columnas múltiples desde una tabla (o tablas) y aparece al menos un operador aritmético en la instrucción SELECT)

"Select Distinct(Igualdad), idBco From BcoPregunta"
Pero no devuelve los datos filtrados

y esas combinaciones he probado.
  #6 (permalink)  
Antiguo 12/07/2010, 13:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: 2 Consultas a 1 sobre la misma Tabla

¿Usas SQL Server?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 12/07/2010, 14:32
Avatar de gakutaru  
Fecha de Ingreso: agosto-2005
Ubicación: frente a mi NtbK
Mensajes: 239
Antigüedad: 18 años, 8 meses
Puntos: 6
Respuesta: 2 Consultas a 1 sobre la misma Tabla

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Usas SQL Server?
sip, express 2005

Etiquetas: tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:33.