5

不明な数のレコードセットを UNION にクエリのクエリを実行できるようにしたいと考えています。ただし、query-of-query を実行する場合、レコード セット名にドットまたはブラケットを使用することはできません。

たとえば、これは失敗します。

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

「recordset1」などの動的変数名を使用すると機能しますが、これは関数内にあり、var スコープにする必要があるため、永続化されたオブジェクトでメモリ リークを発生させずに変数名を動的に構築することはできません。

他のアイデアはありますか?

4

4 に答える 4

2

質問を投稿した後、私はいくつかの解決策を思いつきましたが、そこにもっと良いものがあるかもしれません

  • 動的に名前が付けられた変数を引数スコープに書き込み、クエリでスコープなしでそれらを参照することができます

  • 2つのレコードセットを引数として受け入れ、1つの結合されたレコードセットを返す関数を作成します。これをループして、一度にレコードセットを段階的に追加することができます。ただし、これは1つのクエリですべてのUNIONを実行する場合に比べて非常に非効率的であると確信しています。

于 2009-01-27T21:08:59.013 に答える
1

難しい仕事。と を使用して、 に基づいてネストされたループをGetColumnNames()使用QueryAddRow()したソリューションを想像できましたQuerySetCell()。最も効率的なものではありませんが、それほど遅くはありません。もちろん、タスクのサイズによって異なります。

「2 つのレコードセットを結合する関数を作成する」は、たとえば 10 個の引数を受け入れるように作成すると、はるかに効率的になる可能性があります。その場で SQL を変更します。

<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>
于 2009-01-27T21:46:16.630 に答える
1

少し調べてみたところ、CFLib.org の queryConcat を見つけまし 。queryaddrow/querysetcell を使用して 2 つのクエリを連結します。

簡単な関数を追加しました(エラーチェックやデータ検証がないため、そのままでは使用しません):

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

テストとして、私はこれをまとめました:

実際には、フレッド/サミー/フレッドが得られます。

これはおそらく最も効率的な実装ではありませんが、必要に応じて挿入/共用体コードをいつでも変更して高速化することができます。ほとんどの場合、自分で書くコードをできるだけ少なくすることを目指していました。:-)

于 2009-01-27T22:31:46.070 に答える
1

ここに追加されたソリューションはすべてうまくいくはずですが、使用しているデータの量と使用しているデータベースによっては、データベース側でこれを行う方法を見つけようとする方がよいかもしれません。 . 非常に大きなレコード セットでは、レコードを一時テーブルに書き込んで再度選択することが有益な場合がありますが、いずれにせよ、クエリを書き直してデータベースが最初にこれを処理できるようにすることができれば、より良い。

于 2009-02-03T14:08:24.423 に答える