冷融合 QoQ 和条件



不久前我问了一个问题(按列分组结果查询(SQL Server))。并获得了一些在SQL服务器上工作的答案,但我无法将它们作为QoQ的一部分工作。事实证明,CF有一些小的限制,例如无法使用INNER JOIN

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

我正在为几个查询执行此操作,所以我尝试将代码放在一个函数中,在其中插入查询,唯一列名称为 languageId。

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

有没有办法在一个查询中做到这一点?

您可以使用 Q 的 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) )

但当然要有正确的语法和查询参数

最终做了一个几乎这样的工作:与原始解决方案相比,这加快了相当多的速度:)

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

最新更新