Frage

Ich möchte in der Lage sein, eine Abfrage einer Abfrage UNION eine unbekannte Anzahl von Datensatzgruppe zu tun. Jedoch, wenn eine Abfrage-of-Abfrage Punkte oder Klammern tun nicht in Datensatz Namen erlaubt.

Zum Beispiel dies fehlschlägt:

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

Mit dynamischen Variablennamen wie „Recordset1“ Arbeit, sondern dies in einer Funktion und muss var-scoped sein, so kann ich nicht dynamisch die Variablennamen aufzubauen, ohne Speicherlecks in einem persistenten Objekt zu erzeugen.

Jede andere Ideen?

War es hilfreich?

Lösung

Schwierige Aufgabe. Ich konnte eine Lösung mit einer verschachtelten Schleife auf GetColumnNames() Basis vorstellen, mit QueryAddRow() und QuerySetCell(). Es wird nicht die effizienteste sein, aber es ist nicht wirklich langsam. Abhängig von der Größe der Aufgabe, natürlich.

Ihre „eine Funktion erstellen, die zwei Cord-Sets kombiniert“ viel werden könnte effizienter gemacht, wenn Sie es schaffen, sagen wir, zehn Argumente zu akzeptieren. Ändern Sie die SQL on the fly:

<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>

Andere Tipps

Nach der Buchung die Frage, die ich mit ein paar Lösungen kam, aber es könnte besser sein da draußen

  • I dynamisch benannten Variablen auf die Argumente Umfang schreiben könnte und sie dann ohne ihren Umfang in Abfrage Referenz

  • Erstellen Sie eine Funktion, die 2-Cord-Sets als Argumente akzeptiert und gibt ein kombiniertes Recordset. Dies könnte geschlungen über schrittweise einen Re-Cord hinzufügen zu einer Zeit. Ich bin sicher, dass dies sehr ineffizient ist im Vergleich zu allen UNIONs obwohl in einer Abfrage zu tun.

Nach einem schnell bisschen stochert, fand ich diese: queryConcat bei CFLib.org. Es verwendet queryaddrow / querysetcell zwei Abfragen verketten.

Ich habe eine schnelle Funktion (ohne Fehlerprüfung oder Datenvalidierung, so würde ich es nicht verwenden, wie sie ist):

<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>

Als Test, ich warf diese zusammen:

Was tut in der Tat, geben Sie fred / sammy / fred.

Es ist wahrscheinlich nicht die effizienteste Implementierung, aber man kann das Insert / union Code immer verändern, um es schneller zu machen, wenn man will. Meistens war ich Ziel von mir so wenig Code wie möglich zu schreiben. : -)

alle addierten Lösungen hier sollte für Sie arbeiten, aber ich würde auch erwähnen, dass je nachdem, wie viele Daten Sie arbeiten mit und die Datenbank, die Sie verwenden, könnten Sie besser dran versuchen, einen Weg zu finden, diese zu tun die Datenbankseite. Bei sehr großen Datensätzen, könnte es von Vorteil sein, die Datensätze in eine temporäre Tabelle zu schreiben, und wählen Sie sie wieder heraus, aber so oder so, wenn Sie in irgendeiner Art und Weise können die Abfragen umschreiben die Datenbank handhaben dies in erster Linie, um Sie sein besser dran.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top