coldfusion-QoQ和条件句

coldfusion-QoQ和条件句,coldfusion,qoq,Coldfusion,Qoq,我刚才问了一个问题。并且得到了一些在SQL server上有效的答案,但是我不能让它们作为QoQ的一部分工作。事实证明CF有一些小的限制,比如不能使用内部连接 我试图实现的是,得到一个查询,同一个项目可以有多个项目名称,但当我调用我的QoQ时,我希望它过滤保留与语言ID匹配的项目(如果有),如果缺少,则默认为另一个 我对几个查询执行此操作,因此我尝试将代码放入函数中,在其中插入查询,uniqueColumn name和languageId 因为我不能使用内部联接,而且我对某些条件有问题,所以我考

我刚才问了一个问题。并且得到了一些在SQL server上有效的答案,但是我不能让它们作为QoQ的一部分工作。事实证明CF有一些小的限制,比如不能使用内部连接

我试图实现的是,得到一个查询,同一个项目可以有多个项目名称,但当我调用我的QoQ时,我希望它过滤保留与语言ID匹配的项目(如果有),如果缺少,则默认为另一个

我对几个查询执行此操作,因此我尝试将代码放入函数中,在其中插入查询,uniqueColumn name和languageId

因为我不能使用内部联接,而且我对某些条件有问题,所以我考虑创建第二个表,该表只有匹配的languageId,然后添加另一个表中缺少的条目


有没有一种方法可以在一个查询中实现这一点?

您可以使用Q/Q进行内部联接。您只是不能使用关键字join。您必须在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) )

但是,通过正确的语法和查询参数,当然,最终的结果是:与原始解决方案相比,这大大加快了速度:

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