Foros del Web » Programando para Internet » ASP Clásico »

Query adentro de un query

Estas en el tema de Query adentro de un query en el foro de ASP Clásico en Foros del Web. Hola a todos, ya le busque y creo que voy bien pero pues ya me sale un error que de ahi ya no paso. Requiero ...
  #1 (permalink)  
Antiguo 07/07/2005, 18:09
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 19 años, 8 meses
Puntos: 0
Pregunta Query adentro de un query

Hola a todos, ya le busque y creo que voy bien pero pues ya me sale un error que de ahi ya no paso. Requiero saber los nombres de algunos registros de la Tabla: Palabras la cosa esta asi.

Tengo o vamos, conosco el IdCategoria de la Tabla: PalabrasEnCategoria y de acuerdo a los ejemplos que he visto asi seria la consulta...

Código:
SELECT Palabra FROM Palabras WHERE IdPalabra = (SELECT IdCategoria, IdPalabra FROM PalabrasEnCategoria where IdCategoria="&RsIdCategoria&") order by Palabra
Me sale el siguiente error:


Cita:
Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][Controlador ODBC Microsoft Access] Ha escrito una subconsulta que puede devolver más de un campo sin utilizar la palabra reservada EXISTS en la cláusula FROM de la consulta principal. Corrija la instrucción SELECT de la subconsulta para solicitar un único campo
Bueno hasta ahi no se que es lo que estoy haciendo mal y por otro lado; se como hacerle para jalar la informacion de varios registros seleccionados pero como nunca he echo esta clase se consultas, me supongo que no va a poder ser asi:

Código:
if not rs.eof then
	while not rs.EOF 
               jalo info     
	rs.MoveNext
	wend
end if
O si?

Gracias por sus comentarios...
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #2 (permalink)  
Antiguo 07/07/2005, 18:16
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
No se que es lo que quieras pero generalemente una consulta con una subconsulta, te deberia arrojar varios resultados, espero que sea el caso, si no especifica bien esto, pues bien, si es asi, se supone que la subconsulta te deberia arrojar varios resultados, entonces solamente necesitas agregar la palabra IN

Código:
SELECT Palabra FROM Palabras WHERE IdPalabra IN(SELECT IdCategoria, IdPalabra FROM PalabrasEnCategoria where IdCategoria="&RsIdCategoria&") order by Palabra
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #3 (permalink)  
Antiguo 07/07/2005, 20:11
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 19 años, 8 meses
Puntos: 0
Pregunta

Hola otra vez u_goldman, pues puse el In como me comentaste y continua el mensaje de error; bien lo que requiero es esto:

Mostrar esto en pantalla:



La categoria seria Salud con IdCategoria=3



La tabla intermedia es:



Y la tabla en done estan las palabras es:



Como hay que mostrar la informacion de acuerdo al RsIdCategoria que se seleccione, lo que se me ocurrio fue el query q ya habia comentado:

Código:
SELECT Palabra FROM Palabras WHERE IdPalabra in (SELECT IdCategoria, IdPalabra FROM PalabrasEnCategoria where IdCategoria="&RsIdCategoria&") order by Palabra
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #4 (permalink)  
Antiguo 08/07/2005, 04:44
Avatar de El_Metallick  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.718
Antigüedad: 21 años, 7 meses
Puntos: 16
el in no deberia ir pegado al parentesis osea in(..... o no afecta en nada??? saludos
__________________
Haz la guerra en la cama y el amor donde se te de la gana...
El tiempo es el mejor maestro, lo único malo es que te mata...¡¡Aprovecha tu tiempo!!
  #5 (permalink)  
Antiguo 08/07/2005, 09:48
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Yo creo que la subconsulta debería devolver un solo campo (al menos eso es lo que indica el mensaje de error ;)

SELECT Palabra FROM Palabras WHERE IdPalabra IN(SELECT IdPalabra FROM PalabrasEnCategoria where IdCategoria="&RsIdCategoria&") order by Palabra

(sólo le quité el IdCategoria del SELECT a la subconsulta)
__________________
...___...
  #6 (permalink)  
Antiguo 08/07/2005, 15:48
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

Tambien prueba si lo puedes lograr con un JOIN, siempre es mucho mejor el JOIN que las subconsultas:

"SELECT p.Palabra
FROM Palabras p
LEFT JOIN PalabrasEnCategoria pc on p.IdPalabra = pc.IdPalabra
where pc.IdCategoria =" & Cstr(RsIdCategoria)
order by p.Palabra

Si entendi bien la consulta, creo que seria de esa forma.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #7 (permalink)  
Antiguo 08/07/2005, 21:18
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 19 años, 8 meses
Puntos: 0
De acuerdo

Muchisimas gracia a los comentarios de todos, pero ssssss me quito el sombrero con Neuron_376 solo copie query que me comentaste y a la primera jala lo que necesitaba, muchas gracias

Ahora me gustaria desmembrar lo que pusiste para saber jeje que es lo que se esta haciendo esctamente si en algo estoy mal me gustaria que me corrijas:

FROM Palabras p (aqui creeo que el nombre de la tabla Palabras la transformas a P)

Cita:
LEFT JOIN PalabrasEnCategoria pc on p.IdPalabra = pc.IdPalabra
Creo que tomas PalabrasEnCategoria la cual esta a la derecha de Join y a esta le cambias el nombre por PC y on es algo asi como un Where no? pero utilizado para los Join? y lo demas pues ya todos lo sabemos... sss me gusto un buen esta consulta esta padrisima,

Saludos... Y gracias de nuevo.
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #8 (permalink)  
Antiguo 11/07/2005, 09:35
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
La caracteristica con una consulta de tipo left, right, es que te trae lo que haya a la izquierda o derecha, segun sea el caso, sin importar que el elemento que hace la union tenga resultados.

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #9 (permalink)  
Antiguo 11/07/2005, 09:44
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

Pues lo que dices correcto, eso es lo que esta pasando, si miras tus tablas todo esta relacionado por el idCategoria, entonces te basas en eso para las relaciones de las tablas, el JOIN hace todo mas rapido que la subconsulta, porque en una subconsulta para cada registro en el scan de la tabla, vuelve a consultar los valores con los cuales debe compararse, donde se optimiza un poco la subconsulta es cuando usa valores en el cache de la DB mientras pide la siguiente subconsulta, etc., con el JOIN, establece puntos de relación (apuntadores directos) a los campos que tienen relacion, no ocupa cargar N veces la misma tabla, ademas, como esta la consulta con el JOIN basada en un INDEX, es un scan mas facil todavia porque esta trabajando sobre el index.

Bueno, ahí radica que el JOIN sea mas eficiente.

Y lo que dice u_goldman tambien es correcto, sin el left, si en algun registro no concuerda no te traera resultados, con el left si te trae esos resultados, ahí es donde tienes que hacer pruebas con cual de los dos tipos te conviene mas usar.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #10 (permalink)  
Antiguo 11/07/2005, 09:51
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Pero ojo, aunque en este caso, el mensaje de error les indicó a todos la BD's que se estaba utilizando, hasta donde se LEFT y RIGHT no son instrucciones ANSI, por lo que habrá que referir a los futuros visitantes de este post a que verifiquen el modificador OUTTER.

Saludos
  #11 (permalink)  
Antiguo 11/07/2005, 09:56
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Te refieres a que no cumple con el estandar?
mmmhhh...si, a lo mejor solo funciona con tecnologia MS, yo no se por que MS hace esto, por ejemplo, en un INNER JOIN, puedes utilizar JOIN nada mas y jala, crea malas costumbres...en fin, buena observacion!

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #12 (permalink)  
Antiguo 11/07/2005, 09:59
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
En informix,por ejemplo, no funcionan los LEFT y RIGHT
  #13 (permalink)  
Antiguo 11/07/2005, 10:08
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Es decir, que no puedes hacer una consulta del tipo:

Código:
SELECT a.1, b.1 FROM a LEFT JOIN b etc...
Con o sin OUTER?
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #14 (permalink)  
Antiguo 11/07/2005, 10:09
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

Buena observacion, a mi no me ha dado problemas, en ACCES, MySql, y SQL Server, pero si, de acuerdo, cada persona debe probar sobre su propia base de datos, y del inner, es cierto, al principio cuando empece con MySql, fue un problema porque no entendia poque mi JOIN normal no funcionaba , mejor usar siempre inner join en las consultas.

Un saludo
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #15 (permalink)  
Antiguo 11/07/2005, 10:11
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Cita:
Iniciado por Neuron_376
mi JOIN normal no funcionaba
Es que tu JOIN normal aplica para M$ nomas, y de hecho creo que cuando corres una consulta en el analyzer te quita el "INNER" no?
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #16 (permalink)  
Antiguo 11/07/2005, 10:19
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

No te quita el inner, y funciona normalmente.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #17 (permalink)  
Antiguo 11/07/2005, 11:51
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Cita:
Iniciado por u_goldman
Es decir, que no puedes hacer una consulta del tipo:

Código:
SELECT a.1, b.1 FROM a LEFT JOIN b etc...
Con o sin OUTER?
Por ejemplo:

En SQL-Server
Código:
SELECT tbscc01.no_empleado, tbscc01.empleado AS clave_presupuestal, tbscc01.nombre, tbscc01.apellido_pat, 
tbscc01.apellido_mat, tbscc01.activo, tbscc04.Fecha_ingreso, ctscc25.Descripcion AS plaza, 
ctscc24.Descripcion AS nivel, codificadores.id_puesto 
FROM (ctscc25 RIGHT JOIN ((tbscc01 LEFT JOIN tbscc04 ON tbscc01.no_empleado = tbscc04.No_empleado) 
LEFT JOIN ctscc24 ON tbscc04.Niv_tabular = ctscc24.Niv_tabular) ON ctscc25.Plaza = tbscc04.Plaza) 
LEFT JOIN codificadores ON tbscc01.no_empleado = codificadores.No_empleado 
WHERE (((tbscc01.activo)='t')) and 
tbscc01.no_empleado like '" & request.Form("buscar") & "%'

En Informix:
Código:
SELECT Tbscc01.no_empleado, Tbscc01.nombre, Tbscc01.empleado clave_presupuestal, Tbscc01.apellido_pat,
Tbscc01.apellido_mat, Tbscc01.activo, Tbscc04.fecha_ingreso, Ctscc25.descripcion plaza, 
Codificadores.id_puesto, Ctscc24.descripcion nivel 
FROM tbscc01 Tbscc01, OUTER (tbscc04 Tbscc04, codificadores Codificadores, OUTER ctscc25 Ctscc25, 
OUTER ctscc24 Ctscc24)
WHERE  (Tbscc01.no_empleado = Tbscc04.no_empleado)  
AND  (Tbscc04.plaza = Ctscc25.plaza)
AND  (Tbscc04.niv_tabular = Ctscc24.niv_tabular)  
AND  (Codificadores.no_empleado = Tbscc01.no_empleado)  
AND  (Tbscc01.activo = 'T') and 
tbscc01.no_empleado like '" & request.Form("buscar") & "%'
Saludos
  #18 (permalink)  
Antiguo 11/07/2005, 11:55
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Entendido y anotado!

Gracias!
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
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 21:41.