クエリ関数やクエリオブクエリを利用して、複数のクエリでの取得結果を一つのクエリにまとめる方法です。
注意
条件によってパフォーマンスが下がる可能性もあるので、利用する場合は検証をしっかりとしておきましょう。
サンプルコード
SQL文で結合しまくって一気に取得してもいいかもしれませんが、
場合によっては単純なSQLを複数回実行した方が早いときも…あったりなかったり…
<cfquery name="getQuery" datasource="testdb"> SELECT id , name , state FROM flowstate WHERE state=0 </cfquery> <cfscript> // データ格納用のクエリを作成する dataSetQuery = QueryNew("id,name,state", "Integer,VarChar,Integer"); rowCount = 1; // とりあえず2x10個のレコードをセットする for (i=1; i<=10; i++) { QueryAddRow(dataSetQuery, getQuery.RecordCount); for (tmpQry in getQuery) { // データをセットする QuerySetCell(dataSetQuery, 'id', tmpQry.id, rowCount); QuerySetCell(dataSetQuery, 'name', tmpQry.name, rowCount); QuerySetCell(dataSetQuery, 'state', tmpQry.state, rowCount); rowCount += 1; } } writeDump(dataSetQuery); </cfscript> <!--- クエリオブクエリを利用して保持したデータをソートする ---> <cfquery dbtype="query" name="queryOfQuery"> SELECT * FROM dataSetQuery ORDER BY id </cfquery> <cfdump var="#queryOfQuery#">
実行結果
実行結果は下記の通りです。
(左がソート前で右がソート後)
MEMO
気が向いたらColdFusionのバージョンによってクエリオブクエリの実行結果に差異があるか検証します。