FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Reutilizar resultado de SQL en SQL
buenos Días, una pregunta simple. Cuando se realiza una SQL en un componente ADOQuery, ¿es posible reutilizar esa consulta dentro de otra ADOQuery, sin necesidad de crear una tabla física en la BD (aunque sea en tiempo de ejecución)?.
Me explico: 1.- Realizo un ADOQuery: Código:
..... ADOQuery1.SQL.Add('select * from tabla1'); ADOQuery1.Active := true; ..... Código:
...... ADOQuery2.SQL.Add('select * from tabla1 a,ADOQuery1 b'+ ' where a.dato1= b.dato2') ...... |
#2
|
||||
|
||||
Código:
Query.Sql.Text := 'SELECT * FROM EMPLEADOS'; Query.Open; .... Query.Close; Query.Sql.Text := 'SELECT * FROM EMPLEADOS, EMPRESA WHERE...'; Query.Open;
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
||||
|
||||
Gracias por contestar delphi.com.ar, en realidad la pregunta se dirige mas a la manera de utilizar los resultados de una consulta SQL, como si fuese una tabla más. Algo similar a los cursores de Visual Foxpro.
Es decir tu realizas una consulta SQL que te devuelve unos resultados concretos y esos resultados se encuentran disponibles aunque se modifiquen los datos de origen ya que tú los tienes en memoria. Esos resultados pueden servirte para múltiples utilidades y entre ellas lo que búsco es utilizarlos dentro de otra consulta SQL. A grandes rasgos, ¿se podría realizar una SQL sobre esos resultados?. En tu ejemplo, ¿podría hacer?: Código:
Query1.Sql.Text := 'SELECT * FROM EMPLEADOS'; Query1.Open; Query2.Sql.Text := 'SELECT * FROM Query1, EMPRESA WHERE...'; Query2.Open; |
#4
|
||||
|
||||
Pero si hablas de SQL, es lo mismo... Digamos que lo único que haces es agregar una tabla y/o mas condiciones... No estas alterando el resultado. Tus resultados estan directamente relacionados con el SQL.
Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#5
|
||||
|
||||
El problema me ha surgido, cuando debo actualizar los datos de una tabla basándome en la propia tabla. Es decir, tengo una tabla con los siguientes datos:
Código:
Codigo Texto Valor1 Valor2 1 prueba1 32 12 2 prueba2 31 11 1 10 3 prueba3 22 19 2 prueba6 30 15 1 17 Para solucionarlo, he utilizado la siguiente sentencia: 1.- Obtengo los códigos que no utilizaré en la actualización Código:
(SQL1) SELECT Codigo, Count(Codigo) FROM Tabla WHERE Valor1 Is Not Null GROUP BY Codigo HAVING Count(Codigo)>1 Código:
(SQL2) SELECT Codigo, Texto, Valor1 FROM Tabla LEFT JOIN SQL1 ON Tabla.Codigo = SQL1.Codigo WHERE SQL1.Codigo Is Null Si todo esto lo realizo sin la ayuda de una tabla auxiliar, no podría actualizar los datos de tabla1, ya que estaría utilizando los propios datos de tabla1 para decidir cual debo actualizar. Es decir el típico problema de consulta no actualizable en el UPDATE. Por esto es por lo que deseo utilizar los resultados que tengo en memoria como una tabla independiente. Gracias. Un saludo. |
#6
|
||||
|
||||
Hola de nuevo, el tipo de consultas que quiero realizar y que no se me ocurre como hacer sin la creación de tablas en la BD son como esta:
Código:
UPDATE TMPPAR AS a SET a.TMPPAR_TXT = (select distinct b.TMPPAR_TXT from TMPPAR AS b where a.TMPPAR_COD=b.TMPPAR_COD and b.TMPPAR_TXT is not null and b.TMPPAR_TXT<>'') WHERE a.TMPPAR_TXT is null or a.TMPPAR_TXT=''; Espero vuestra ayuda. Un saludo |
#7
|
||||
|
||||
Hola.
Eso es una subconsultas, y normalmente todos los servidores SQL las aceptan (excepto MySQL). ¿ Que motor utilizas ? Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#8
|
||||
|
||||
Hola guillotmarc, utilizo Access 2000. En efecto son subconsultas y se pueden utilizar sin ningún problema. El problema proviene de utilizar como subconsulta la propia tabla que estas intentando actualizar con el UPDATE.
Código:
UPDATE A as 1 SET 1.dat=(select 2.dat from A as 2) En este tipo de casos, yo en otro motores utilizaba tablas temporales, cursores o estrategias similares, pero en Delphi, ¿me preguntaba si el resultado de una consulta podía utilizarse como un cursor y utilizarla su resultado dentro de otra SQL?. Gracias. Un saludo. |
#9
|
||||
|
||||
Hola.
Parece ser un problema del Access 2000. Lo he probado, y simplemente no acepta subconsultas en el UPDATE (sea la subconsulta la propia tabla a modificar, o no). Si solo fuera un problema de que la tabla es la misma en la subconsulta y en el UPDATE, bastaría con crear una vista igual a la tabla, y hacer la subconsulta sobre la vista. Pero lo he probado, y parece ser que Access no permite ningún tipo de subconsulta en el UPDATE (ni sobre la misma tabla, una vista, u otra tabla cualquiera). El problema de utilizar cursores SQL, es que se utilizan desde procedimientos almacenados (donde se pueden indicar varias instrucciones SQL : para definir el cursor, recorrerlo, actualizar la tabla, ...), pero Access no tiene un lenguaje de procedimientos almacenados. Así parece ser que tendrás que hacerlo todo en Delphi. Un cursor en Delphi, es un Dataset abierto con un TADOQuery, lo abres y lo puedes recorrer y modificar. Simplemente pón un TQuery para recorrer la tabla, y otro TQuery para averiguar el valor buscado. Recorres el primer Query y para cada registro, cierras y vuelves a abrir el segundo Query, averiguando el valor que necesitas para modificar el registro actual en el primer Query. Más o menos : Código:
ADOQuery1.Open while not ADOQuery1.Eof do begin ADOQuery2.Params.ParamValues['Codigo'] := ADOQuery1.FieldValues['Codigo']; ADOQuery2.Open; ADOQuery1.Edit; ADOQuery1.FieldValues['Campo'] := ADOQuery2.FieldValues['Resultado']; ADOQuery1.Post; ADOQuery2.Close; ADOQuery1.Next; end; Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#10
|
||||
|
||||
Gracias por contestar guillotmarc, dadas las limitaciones de Access 2000, lo realizaré como indicas.
Gracias a todos por vuestras contestaciones. Un saludo. |
|
|
|