1

不久前,我问了一个问题(按列(SQL Server)对结果进行分组查询)。并得到了一些适用于 SQL 服务器的答案,但我无法让它们作为 QoQ 的一部分工作。原来 CF 有一些小的限制,比如不能使用INNER JOIN

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

我正在为几个查询执行此操作,因此我试图将代码放在一个函数中,在其中插入查询,uniqueColumn 名称为 languageId。

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

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

4

2 回答 2

0

您可以使用 Q of Q 进行内部联接。您不能使用关键字“join”。您必须在 where 子句中加入您的查询。像这样的东西:

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

Q of Q union 查询的完成方式与对数据库查询的处理方式相同。要执行这样的操作,“我希望它过滤(保留)与语言 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 回答