¿Cómo puedo utilizar la consulta de la consulta de UNIÓN en la n-conjuntos de registros cuando var alcance es necesario?

StackOverflow https://stackoverflow.com/questions/485212

  •  20-08-2019
  •  | 
  •  

Pregunta

Me gustaría ser capaz de hacer una consulta de una consulta a la UNIÓN de un número desconocido de conjunto de registros.Sin embargo, cuando se realiza una consulta de consulta de los puntos o de los soportes no están permitidos en el conjunto de registros de nombres.

Por ejemplo, esta falla:

<cfquery name="allRecs" dbtype="query">
    SELECT * FROM recordset[1]
    UNION
    SELECT * FROM recordset[2]
</cfquery>

Uso dinámico de nombres de variables, tales como "recordset1" de trabajo, pero esto es en una función y debe ser var ámbito así que no se puede construir hasta los nombres de variable de forma dinámica, sin producir pérdidas de memoria en un objeto persistente.

Cualquier otra idea?

¿Fue útil?

Solución

Tarea difícil.Podía imaginar una solución con un bucle anidado basado en GetColumnNames(), utilizando QueryAddRow() y QuerySetCell().No va a ser la más eficiente, pero no es realmente lento.Depende del tamaño de la tarea, por supuesto.

Su "crear una función que combina dos conjuntos de registros" podría ser mucho más eficiente en el momento de crear a aceptar, por ejemplo, de diez argumentos.Modificar el SQL sobre la marcha:

<cfset var local = StructNew()>

<cfquery name="local.union" dbtype="query">
  SELECT * FROM argument1
  <cfloop from="2" to="#ArrayLen(arguments)#" index="local.i">
    <cfif IsQuery(arguments[local.i])>
      UNION
      SELECT * FROM argument#local.i#
    </cfif>
  </cfloop>
</cfquery>

<cfreturn local.union>

Otros consejos

Después de publicar la pregunta se me ocurrió un par de soluciones, pero podría haber una mejor por ahí

  • Podría escribir variables con nombres dinámicos en el alcance de los argumentos y luego hacer referencia a ellos sin su alcance en la consulta

  • Cree una función que acepte 2 conjuntos de registros como argumentos y devuelva un conjunto de registros combinado. Esto podría repetirse para agregar progresivamente un conjunto de registros a la vez. Estoy seguro de que esto es muy ineficiente en comparación con hacer todas las UNION en una sola consulta.

Después de hurgar un poco, encontré esto: queryConcat en CFLib.org. Utiliza queryaddrow / querysetcell para concatenar dos consultas.

Agregué una función rápida (sin verificación de errores ni validación de datos, por lo que no la usaría tal cual):

<cffunction name="concatenate">
     <cfset var result = arguments[1]>
     <cfloop from="2" to="#arraylen(arguments)#" index="i">
             <cfset result=queryconcat(result, arguments[i])>
     </cfloop>
     <cfreturn result>
 </cffunction>

Como prueba, hice esto:

Que, de hecho, te da fred / sammy / fred.

Probablemente no sea la implementación más eficiente, pero siempre puede alterar el código de inserción / unión para hacerlo más rápido si lo desea. Principalmente, tenía el objetivo de escribir el menor código posible por mí mismo. :-)

todas las soluciones agregadas aquí deberían funcionar para usted, pero también mencionaría que dependiendo de la cantidad de datos con los que esté trabajando y la base de datos que esté utilizando, es mejor que intente encontrar una manera de hacerlo el lado de la base de datos. Con conjuntos de registros muy grandes, puede ser beneficioso escribir los registros en una tabla temporal y seleccionarlos nuevamente, pero de cualquier manera, si puede reescribir las consultas de alguna manera para que la base de datos maneje esto en primer lugar, estará mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top