Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-11-2007
Ariel03 Ariel03 is offline
Miembro
 
Registrado: oct 2006
Posts: 19
Poder: 0
Ariel03 Va por buen camino
Consulta sobre un Query

hola tengo un problema....tengo una consulta sql hecha sobre una tabla y la guardo en un query1...los campos son (NºSocio, estado, fecha)..ahora bien tengo la tabla socios que tiene los campos (NºSocio, apellido, nombre)...lo que quiero es hacer una consulta sql entre el query1 y la tabla socios para que me devuelva los datos personales de los socios que estan en el query1... alguien me puede dar una mano... intente pero no hay caso.
gracias
Ariel
Responder Con Cita
  #2  
Antiguo 21-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Tabla1= ?
Tabla1= se obtiene sql en un query
Tabla2= Socios
Cual es el nombre de la tabla 1
No se guardan datos en un query, se obtienen y presentan.
Por que no usar otra sentencia sql?
Código SQL [-]
Select * from Tabla1, Socios
Por la explicación que das esto se me ocurre
Saludos
Responder Con Cita
  #3  
Antiguo 21-11-2007
Ariel03 Ariel03 is offline
Miembro
 
Registrado: oct 2006
Posts: 19
Poder: 0
Ariel03 Va por buen camino
si la verdad lo exprese un poco... la idea es esta:
tengo una tabla HISTORIAL con los campos [NºSocio, Fecha, Estado] y otra tabla SOCIOS con los campos [NºSocio, Apellido, Nombre].
Ahora realizo una consulta sql con un query1 sobre la tabla HISTORIAL y me devuelve unos cuantos registros... eso depende...ahora lo que quiero obtener son los datos personales de estos socios que se encuentran en la tabla SOCIOS con otra consulta sql usando otro query y no se como hacerlo.. ojala me hallan entendido mejor.
saludos
Responder Con Cita
  #4  
Antiguo 21-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Complicado como sigues explicandolo.
Tienes un query que obtiene los datos de un sql de una tabla, bien.
Quieres con otro query obtener los datos de las dos tablas, pero segun el query, esta parte no la entiendo.
Para mi es un query aparte y una sentencia sql, asi:
Código SQL [-]
Select * from HISTORIAL, SOCIOS
Ahora haciendo algo diferente seria:
Código SQL [-]
Select * from HISTORIAL, SOCIOS where HISTORIAL.NºSocio = SOCIOS.NºSocio
Otra:
Código SQL [-]
Select * from SOCIOS where HISTORIAL.NºSocio = SOCIOS.NºSocio
No lo entiendo bien, perdon.
Saludos
Responder Con Cita
  #5  
Antiguo 21-11-2007
Ariel03 Ariel03 is offline
Miembro
 
Registrado: oct 2006
Posts: 19
Poder: 0
Ariel03 Va por buen camino
si esta bien lo q decis pero no es precisamente lo que quiero... por ejemplo seria asi:

de la tabla HISTORIAL (NºSocio, Estado, Fecha) con un query hago una consulta sql selecciono todos los q tienen "Estado = Inscripto", ahora bien en los registros q me devulve la consulta no tengo los datos personales de los socios solamente tengo el NºSocio, ahora bien lo que quiero es q con otra consulta sql poder obtener los datos personales de esos socios, que se encuentran en la tabla SOCIOS(NºSocio, Apellido, Nombre).
gracias por las respuestas igual.
saludos
Responder Con Cita
  #6  
Antiguo 21-11-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Bueno, lo que te ha estado explicando Caral es lo que requieres, solo que te está faltando algo en tu clausula

Trata con esto

Código SQL [-]
Select * from HISTORIAL, SOCIOS 
where HISTORIAL.NºSocio = SOCIOS.NºSocio and HISTORIAL.Estado = 'Inscripto'

O tambien puedes usar el INNER JOIN

Código SQL [-]
Select * from HISTORIAL 
where HISTORIAL.Estado = 'Inscripto'
INNER JOIN SOCIOS on HISTORIAL.NºSocio = SOCIOS.NºSocio

Dejanos saber tus resultados.

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney

Última edición por egostar fecha: 21-11-2007 a las 03:43:10.
Responder Con Cita
  #7  
Antiguo 21-11-2007
Ariel03 Ariel03 is offline
Miembro
 
Registrado: oct 2006
Posts: 19
Poder: 0
Ariel03 Va por buen camino
ok la verdad me sirvio mucho gracias de verdad.
Responder Con Cita
  #8  
Antiguo 21-11-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por egostar Ver Mensaje
O tambien puedes usar el INNER JOIN...
Mejor siempre con la INNER JOIN.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 25-11-2007
Puberta Puberta is offline
Miembro
 
Registrado: oct 2007
Ubicación: Estado de México
Posts: 47
Poder: 0
Puberta Va por buen camino
Hola, alguien me puede ayudar?

Tengo un Query, el cual contiene los campos de 6 tablas.....el problema es que al hacer la consulta de todo se tarda 6 horas y solo son 180 registros. Lo que intento hacer es modificar la consulta con Inner Join, pero no encuentro la forma de relacionar las tablas, bueno me falta una:

Las Tabla1, tabla2, Tabla3, Tabla4 se relacionan con el id_emp, y al mismo tiempo tabla4 se relaciona con tabla5 mediante el planta y categoria; y por último con tabla6 con los campos planta y depto...como le puedo hacer.

Intenté esto, pero me falta una tabla aún:

Cita:
Select * FROM
Tabla5 d Inner Join
(Tabla4 er Inner Join
(Tabla3 l Inner Join (Tabla2 t Inner Join Tabla1 e ON t.empleado = e.empleado)
ON l.empleado = t.empleado AND l.fecha = t.fecha)
ON er.empleado = l.empleado)
ON er.planta = d.planta AND d.departamento = er.departamento, Tabla6 c
Where c.planta = er.planta and c.categoria = er.categoria

o esto...

Cita:
Select *
From Tabla5 d Inner Join (Tabla4 er Inner Join Tabla6 c ON d.planta = c.planta and c.categoria = er.categoria) ON er.planta = d.planta AND d.departamento = er.departamento, Tabla3 l Inner Join (Tabla2 t Inner Join Tabla1 e ON t.empleado = e.empleado) ON l.empleado = t.empleado AND l.fecha = t.fecha) ON er.empleado = l.empleado
Where er.empleado = l.empleado
ninguna de las 2 me gustan...no sé si estan bien porque no tengo a base de datos, solo me dieron los campos de las tablas....ojala alguien me pueda ayudar.
Responder Con Cita
  #10  
Antiguo 26-11-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Puberta Ver Mensaje
Hola, alguien me puede ayudar?
Antes de nada, te recomiendo que leas la Guía de estilo de los foros; No mezcles mensajes, si haces una nueva pregunta abre un nuevo hilo, no mezcles hilos con preguntas diferentes.

En cuanto a la pregunta (sólo por esta vez); Intenta crearte una Base de Datos local con pocos registros para probar si está bien o no.

Debería saber el plan de ejecución que se está haciendo y porqué está tardando tanto; Indices, Claves,....

La idea de los INNER es que todo lo que pones en un WHERE igualando los campos lo pases a INNER entre esas dos tablas y la parte del WHERE es lo que pasa a ser el ON.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #11  
Antiguo 26-11-2007
Puberta Puberta is offline
Miembro
 
Registrado: oct 2007
Ubicación: Estado de México
Posts: 47
Poder: 0
Puberta Va por buen camino
Gracias Neftali por contestar, aún cuando no hice lo correcto.

Cita:
Cita:
Antes de nada, te recomiendo que leas la Guía de estilo de los foros; No mezcles mensajes, si haces una nueva pregunta abre un nuevo hilo, no mezcles hilos con preguntas diferentes.

Disculpa, no quiero ser grosera pero hace 2 semanas movieron un mensaje que escribí porque era tema repetido, por lo que esta vez opte por ingresar mi mensaje en este hilo porque es una duda sobre un query y hablan de Inner Join que es con respecto a lo que tengo duda...escribi mal el titulo? o se trata de todo mi mensaje?.

Tienes razón intentaré crear una base de datos local, no tengo la menor idea de que sucede ni de las llaves o índices...sólo sé que al ejecutar el SP tarda seis horas y si lo vuelvo a ejecutar tarda aún más....creo que no es problema de SP, sino del perfomance. Aún así mi jefe ya me tiene fastidiada con que debo saber de que se trata y corregirlo.
Responder Con Cita
  #12  
Antiguo 26-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por Puberta Ver Mensaje
Disculpa, no quiero ser grosera pero hace 2 semanas movieron un mensaje que escribí porque era tema repetido, por lo que esta vez opte por ingresar mi mensaje en este hilo porque es una duda sobre un query y hablan de Inner Join que es con respecto a lo que tengo duda...escribi mal el titulo? o se trata de todo mi mensaje?.
[sarcasmo on]
Pues se ve que no leiste la guía de estilo en aquel momento , así que viene al caso la recomendación de Neftali
[sarcasmo off]

Ya en serio, si repites hilos nos mareas a todos. Si no pones nombres descriptivos, no sirven para otro forista que use el buscador, etc.
Con 21 mensajes, ya deberías usar etiquetas sql o delphi en tu código....Todo eso se explica en la guía de estilo.

No te agobies con todas las "normas mencionadas", poniendo de tu parte, un día miras la guía de estilo, otro día las etiquetas, etc.

En cuanto a la pregunta, con todo respeto a tu jefe, le debes decir que no eres adivina. Si no sabes las claves primarias ni los índices ¿como quiere que agilices tu consulta? ¿puedes arreglar un coche si no te dan el coche?

Una consulta se agiliza sabiendo las claves primarias y creando índices por los campos más usados. Si no dispones de ellos, no puedes hacer nada, tan solo usar el método de prueba y error.

Yo uso una forma distinta de unir las tablas, a ver que tal:
Código SQL [-]
Select * FROM 
Tabla1 a 
   Inner Join tabla2 b on a.id_emp = b.id_emp
   inner join tabla3 c on a.id_emp = c.id_emp
   inner join tabla4 d on a.id_emp = d.id_emp
   inner join tabla5 e on (d.planta = e.planta and d.categoria = e.categoria)
   inner join tabla6 f on ( 'aquí ya me perdí  ')

- No dices la Base de datos que usas (Firebird, Interbase, MySql).
- Tampoco dices los nombres "reales" de las tablas por lo que es todo muy abstracto.
- Tampoco dices los nombres de todos los campos de las tablas, quizás por el nombre se intuya si es un índice, una clave primaria, etc.

Si no sabes estos datos, dilo en el mensaje, que quede claro que estas mostrando toda la información de que dispones.

Otra opción, es hacer el sql con 2 tablas nada más, y ver cuanto tiempo tarda, ahora vas añadiendo una tabla más, hasta ver la tabla que ralentiza todo el SP, al menos acotas el problema (yo lanzo mi profecía en cuanto a las tablas 5 y 6, por allí debe estar el problema, la unión de las 4 primeras deben ser en ...milisegundos). Las cuatro primeras al tener el mismo campo de unión, fijo que será clave primaria en una y clave ajena en el resto (muy posiblemente con índices).

Edito: El campo fecha no creo que vaya como unión de tablas, es normal que vaya en la parte del Where, pero esto, obviamente, es una conjetura.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 26-11-2007 a las 20:25:21.
Responder Con Cita
  #13  
Antiguo 26-11-2007
Puberta Puberta is offline
Miembro
 
Registrado: oct 2007
Ubicación: Estado de México
Posts: 47
Poder: 0
Puberta Va por buen camino
Cita:
Pues se ve que no leiste la guía de estilo en aquel momento , así que viene al caso la recomendación de Neftali
OK, siguiendo con lo mismo...tienes razón con que no había leído la guia de estilo cuando movieron mi mensaje pero, después si lo hice y leí la otra guía de estilo que sinceramente fue la que realmente me ayudo a entender porque debo especificar todo(eso creía), me disculpo por mi error y me comprometo a leerla hasta que la entienda del todo.

En cuanto a mi problema, las cosas son así la base de datos esta en Informix. Hay un sistema que maneja la nomina(en delphi 7), y lo que esta mal es cuando se genera el reporte de Tiempo Extra, aclaro que no tengo la base de datos, ni todos los nombres de las columnas de las tablas, solo unos cuantos, tampoco tengo los indices ni las relaciones entre estas(si es que existen)....me dieron un código, el cual solo manda los parametros y ejecuta un SP; este a su vez realiza una consulta y el resultado lo guarda en una tabla temporal, en la cual esta basado el reporte.

Espero me explique, son cuatro tablas (empleado, Textra, EmpleadoReloj, TextraReloj), las cuales tienen un campo en comun 'id_empleado'; la tabla EmpleadoReloj esta relacionado con otras dos tablas, con la tabla Categoría se relaciona mediante los campos (planta y categoria) y con la tabla Departamento (planta y departamento)...no tengo idea de como se deben de realizar las uniones con Inner Join porque segun tengo entendido el uso de Inner Join agiliza el tiempo y de eso es lo que se trata, de que sea muchísimo más rápido la generación del reporte.

Tampoco puedo ver si el query funciona porque el SP original esta en el servidor de producción y no lo van a quitar para poner el mio hasta que no se lo muestre a mi jefe y el quede convencido...mi jefe es un poco pesado, pero aún así creo que me toco el mejor pues es muy tranquilo y no me grita o regaña a cada rato como los demás, pero tampoco quiero ir a preguntarle a cada momento y sobretodo quiero presentarle las cosas lo mejor posible, pues voy iniciando a labolar y no quiero que se desesperé tan pronto de mi, ojala me entiendan.


Nota: Todos los campos son de tipo entero y smallint, todavía no me meto con fechas
Responder Con Cita
  #14  
Antiguo 27-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Y el informe que quieres obtener ¿qué muestra?, es decir, quieres mostrar el tiempo extra agrupados por departamentos, plantas y categorías en un periodo de fechas determinado, en ese orden orden, o ¿qué?

- Si unes EmpleadoReloj con TExtra, puedes obtener las horas extras (supongo que es eso) que ha realizado cada trabajador sabiendo la categoría de cada uno.
- Si unes TExtra con Departamento, obtendrás lo mismo pero sin importar la categoría de cada trabajador.

Como digo, el resultado de estos 2 informes, es el mismo, pero haciéndolo de una forma, obtienes más información que de la otra. Debes centrarte en lo que quieres obtener y ver en qué tablas está cada dato importante para tu informe, de ahí tienes que deducir la unión que debes realizar.

Por otro lado, si tienes acceso a producción, con un programa como Erwin (u otros en esta web hay algunos para informix), puedes obtener los metadatos de tu BBDD, es decir, las tablas, campos, relaciones, SP, etc, y crear el modelo Entidad-Relación, así verás las relaciones más claras.

Este tipo de programas hacen lo contrario, es decir, creas el modelo E-R y a partir de ahí crean la base de datos, pero normalmente tienen la opción de "Ingeniería Inversa": A partir de la Base de datos, crean el modelo E-R. Mirando con lupa las opciones que tiene, no modificará la BBDD para nada, y obtendrás el esquema.

Así puedes extraer el SP actual, ver como está hecho, y no caer en los mismos errores, o ver por qué es tan lento.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #15  
Antiguo 28-11-2007
Puberta Puberta is offline
Miembro
 
Registrado: oct 2007
Ubicación: Estado de México
Posts: 47
Poder: 0
Puberta Va por buen camino
Gracias a todos los que aportaron soluciones o recomendaciones. Lepe, he intentado lo que me recomendaste y funcionó....

No sé si le sirva a alguien pero, aún así ingreso el código final...el reporte debe mostrar el empleado, planta, departamento, categoria, fecha(s) que trabajo tiempo extra, las horas que trabajo y cual fue el rango de horas(hora_entrada y hora_salida), agrupado por departamento.

Mi problema era que no sabía relacionar la tabla empleado_reloj con las tablas categoria, departamento y empleado; esta última a su vez estaba relacionada con la tabla textra y textrareloj. Todo esto con el fin de reducir el tiempo al momento de ejecutarse el query.


Cita:
SELECT *
FROM Categoria c Inner Join
(departamento d Inner Join
(empleado_reloj er Inner Join
(empleado e Inner Join
(textrareloj l Inner Join textra t ON l.empleado = t.empleado)
ON e.empleado = l.empleado)
ON er.empleado = e.empleado)
ON d.departamento = er.departamento and d.planta = er.planta)
ON c.categoria = er.categoria and c.planta = er.planta
WHERE e.planta = pPlanta
and l.empleado BETWEEN pEmp1 and pEmp2
and er.departamento BETWEEN pDepto1 and pDepto2
and l.fecha BETWEEN pFecha1 and pFecha2
and e.nomina in (pNom1, pNom2, pNom3)
Este código funciona bien, aunque sinceramente no me ayudo de mucho pues el tiempo que tarda en generarse el reporte sigue casi igual...debe ser problema del servidor, porque no soy la única que tiene problemas al momento de trabajar.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Realizar una consulta sobre los registros que devuelve otra consulta Borjaserrano Firebird e Interbase 12 01-10-2007 23:19:44
Consulta de Query marceloalegre SQL 3 06-02-2006 16:38:37
Pregunta sobre Query silviodp Conexión con bases de datos 28 27-04-2004 23:17:57
Query sobre DataSource???? mguixot OOP 3 25-02-2004 21:26:59
Sobre Query pablo SQL 1 28-11-2003 05:07:14


La franja horaria es GMT +2. Ahora son las 15:55:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi