不久前我问了一个问题( Query with grouped results by column (SQL Server) )。我得到了一些可以在SQL server上工作的答案,但我不能让它们作为QoQ的一部分工作。原来CF有一些小限制,比如不能使用INNER JOIN
我试图实现的是获取一个查询,该查询可以为同一项目提供多个项目名称,但当我调用QoQ时,我希望它过滤(保留)与语言ID匹配的项目(如果有),如果缺少,则缺省为另一个。
我对几个查询这样做,所以我尝试将代码放在一个函数中,在函数中插入查询,将uniqueColumn命名为languageId。
因为我不能使用内部连接,并且我在使用一些条件语句时遇到了问题,所以我在考虑创建第二个只有匹配languageId的表,然后添加另一个表中缺少的条目。
有没有办法在一个查询中做到这一点?
发布于 2012-11-29 08:35:33
你可以使用Q的Q进行内部连接,但不能使用关键字"join“。您必须在where子句中连接查询。如下所示:
select whatever
from query1, query2
where query1.field1 = query2.field2
etcQ个联合查询的执行方式与数据库查询的执行方式相同。要做这样的事情,“我希望它过滤(保留)与语言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) )但当然要有正确的语法和queryparams
发布于 2012-11-29 08:43:50
最终做了相当多的事情:与原始解决方案相比,它的速度要快得多:)
<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>https://stackoverflow.com/questions/13616576
复制相似问题