1

しばらく前に質問をしました(列ごとにグループ化された結果を含むクエリ(SQL Server))。SQLサーバーで機能する回答がいくつか得られましたが、QoQの一部として機能させることはできません. CFには、使用できないなど、いくつかの小さな制限があることがわかりましたINNER JOIN

私が達成しようとしているのは、同じアイテムに対して複数のアイテム名を持つことができるクエリを取得することですが、QoQ を呼び出すときに、言語 ID に一致するアイテムをフィルター (保持) したい場合は、は 1 つであり、欠落している場合はデフォルトで別のものになります。

私はいくつかのクエリに対してこれを行っているので、クエリをプラグインする関数にコードを入れようとしています。uniqueColumn は languageId という名前です。

内部結合を使用できず、いくつかの条件に問題があるため、一致する languageId のみを持つ 2 番目のテーブルを作成し、他のテーブルにないエントリを追加することを考えていました。

1回のクエリでこれを行う方法はありますか?

4

2 に答える 2

0

Q of Q で内部結合を行うことができます。キーワード「結合」は使用できません。where句でクエリを結合する必要があります。このようなもの:

select whatever
from query1, query2
where query1.field1 = query2.field2
etc

Q of Q ユニオン クエリは、データベース クエリの場合と同じ方法で実行されます。このようなことを行うには、「言語 ID に一致する項目があればそれをフィルター処理 (保持) し、欠落している場合は別の項目にデフォルト設定する」というコードは次のようになります。

select query2.actual_value
from query1, query2
where query1.field1 = query2.field2
etc
union
select default_value
from query1
where field1 not in( ValueList(query2.field2) )

もちろん、適切な構文とクエリパラメータを使用して

于 2012-11-29T00:35:33.343 に答える
0

元のソリューションと比較して、これによりかなり高速化されました:)

<cffunction name="getUniqueName" output="true" returntype="Query">
    <cfargument name="q" Type="query" required="true">
    <cfargument name="uniqueColumn" Type="string" required="false" default="ID">
    <cfargument name="languageId" Type="string" required="false" default="">

    <cfif languageID EQ ''><cfset languageID = #session.langID#></cfif> <!--- default language id to user language id --->

    <!--- Get all items that match language ID --->
    <cfquery dbtype="query" name="qwLangId">
        SELECT *
        FROM 
          q
        WHERE 
          languageid = #languageId#  
    </cfquery>

    <!--- Get list of IDs for items found --->
    <cfset usedIDs = ArrayToList(qwLangId[uniqueColumn])>

    <cfif usedIDs NEQ ''>
        <!--- get all items that were not found in matched query --->
        <cfquery dbtype="query" name="qMissing">
            SELECT *
            FROM 
              q
            WHERE #uniqueColumn# NOT IN(#usedIDs#)
        </cfquery>

        <!--- combine items in a new query --->
        <cfquery dbtype="query" name="langQ">
            SELECT * FROM qwLangId
            UNION
            SELECT * FROM qMissing
            ORDER BY #uniqueColumn#
        </cfquery>
        <cfreturn langQ>
    <cfelse>
        <cfreturn q>
    </cfif>

</cffunction>
于 2012-11-29T00:43:49.767 に答える