在查询输出中运行cfquery

时间:2015-05-12 18:44:48

标签: sql-server coldfusion cfquery

当我尝试在上一个查询的输出中运行cfquery时,我得到了奇怪的意外结果。

示例:

<cfoutput query="reportInfo">
  <tr>
    <td>#id#</td>
    <td>#name#</td>    
    <cfif Status EQ 'Complete'>
      <cfquery name="submitInfo" datasource="RC">
        SELECT  *
        FROM    Action_Log
        WHERE Form_ID = '#id#'
        AND Action = 'Complete' OR Action = 'Saved'
      </cfquery>    
      <cfset startStamp = submitInfo.Action_Time>
      <cfoutput>startStamp</cfoutput>    
      <td>#startStamp#</td>
    <cfelse>
      <td>No Completion Date</td>
    </cfif>
  </tr>
</cfoutput>

当&#34; StartStamp&#34;输出到它为循环中的每个计数显示一次的页面,它为每个ID执行此操作,因此有很多额外的。

我认为它应该只在每次包含查询(reportInfo)输出循环时运行commitInfo查询,但是没有发生。

1 个答案:

答案 0 :(得分:1)

(扩展自评论......)

  

<cfoutput>startStamp</cfoutput>

不确定你想要完成什么,但你应该摆脱内在的cfoutput tags。只有在使用(经常被误解)<cfoutput group="..."> feature时才需要这些。它通常用于消除排序数据的重复项。但是,如果数据正确排序 - 或者分组不正确 - 它可以产生您描述的结果类型。 (如果您不熟悉分组,请参阅this example of creating an A-Z type listing)。

话虽如此,应避免在循环内查询。大多数情况下,您可以通过简单的JOIN获得相同的结果。在不了解第一个查询的情况下,我认为没有理由不能在这里做到这一点。

在psuedo-sql中沿着这些方向行事。它使用OUTER JOIN来检索第一个表中的所有记录,但只有Action_Log中具有匹配ID且状态为&#34;完成&#34;的值。或&#34;已保存&#34;。

SELECT  t1.ID
        , t1.Name
        , al.Action_Time AS CompletionDate
FROM    SomeTable t1
      LEFT JOIN Action_Log al 
                ON al.Form_ID = t1.ID 
                AND t1.Status = 'Complete'
                AND al.Action IN ('Complete','Saved')