【ColdFusion】複数のクエリ結果をまとめてソートする方法

クエリ関数やクエリオブクエリを利用して、複数のクエリでの取得結果を一つのクエリにまとめる方法です。

注意

条件によってパフォーマンスが下がる可能性もあるので、利用する場合は検証をしっかりとしておきましょう。

サンプルコード

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

実行結果

実行結果は下記の通りです。
(左がソート前で右がソート後)

%e3%82%bd%e3%83%bc%e3%83%88%e5%89%8d  %e3%82%bd%e3%83%bc%e3%83%88%e5%be%8c

MEMO

気が向いたらColdFusionのバージョンによってクエリオブクエリの実行結果に差異があるか検証します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です