不久前我问了一个问题(按列分组结果查询(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>