ColdFusion查询加入vs我的语法

时间:2017-02-15 13:16:36

标签: jquery join coldfusion

我正在尝试执行查询的ColdFusion查询。第一个查询$sheet = 'public/site.xls'; // load excel content $excel = Excel::load($sheet, function ($reader) { $results = $reader->toObject(); foreach($results as $result) { // i want to know how to retrieve active cell index here } }); 返回多条记录。其中一行是:

qEL

上面的注释:WSBusinessUnit值为216000012,WSTREAMOBJ为32103,WSTREAMSUB为1759

第二个查询是ELINKACCOUNTNUMBER WINACCNT WSTREAMBUSINESSUNIT WSTREAMOBJ WSTREAMSUB 101-40001-0000-15-001-00000-0000 216000012.32103.1750 216000012 32103 1750 ,它确实返回了一堆记录,但只有一行符合上面的记录,列名分别为qEL2FirstSecond

所以我需要做一个连接或者其他什么,这是我的代码:

Third

但是这个查询不会返回任何内容。我应该以某种方式加入吗?

谢谢!

编辑1:也许有些像这样的语法? Having trouble with a SQL Join in ColdFusion

3 个答案:

答案 0 :(得分:1)

开始改变这类事情:

qEL.WSTREAMBUSINESSUNIT =  <cfqueryparam value="#qEL2.First#" CFSQLType="cf_sql_varchar" />

到这种类型的东西

qEL.WSTREAMBUSINESSUNIT =  qEL2.First

查询参数将您的联接限制为qEL2的第一条记录。可能弄乱你的其他东西是空白。确保这些值都不具有前导或尾随空格。

答案 1 :(得分:1)

为了扩展Dan的答案,有一些问题可能阻止代码工作:

  1. 比较两列时,请勿使用井号或cfqueryparam。该语法最终会将一列中的值与单个 literal 值进行比较。例如:

    • WHERE qEL.someID = 2
    • WHERE qEL.firstName = 'Bob'

    要将一列中的所有值与所有中的值进行比较,请使用以下语法:

    WHERE someQuery1.ColumnName = otherQuery2.ColumnName

  2. QoQ非常简陋。它们仅支持一小部分SQL,不包括外连接或字符串函数(如trim())。如果需要,必须在原始数据库查询中完成。

  3. “First”这个词很可能是一个保留字,必须是escaped with square brackets

  4. 与某些数据库不同,QoQ's are case-sensitive中的字符串比较。

      

    与ColdFusion的其余部分不同,查询查询区分大小写。   但是,Query of Queries支持两个字符串函数UPPER()和   LOWER(),您可以使用它来实现不区分大小写的匹配。

    同样,字符串比较对差异过于敏感。因此请注意额外的空白区域,因为即使是单个标签或空格也会阻止匹配。

  5. 可能不适用于此处,但检查数据类型差异。比较具有不同数据类型的列时,QoQ必须首先将两列转换为相同的数据类型。不要依赖隐式转换。如果需要,请使用显式CAST()将列转换为适当的数据类型。例如:

    • WHERE CAST(someQuery1.ColumnName AS INTEGER) = CAST(otherQuery2.ColumnName AS INTEGER)

    • WHERE CAST(someQuery1.ColumnName AS VARCHAR) = CAST(otherQuery2.ColumnName AS VARCHAR)

  6. 最后,从小做起。首先匹配单个列,然后检查结果。如果有效,请转到下一个。否则,请检查列数据类型和值以尝试找出事物不匹配的原因。请记住,浏览器以折叠空白区而闻名,因此如果需要,请逐个字符检查值。

答案 2 :(得分:1)

根据@Dan Bracuk和@Leigh的反馈/回答解决问题。谢谢大家!

不归还问题主要与QEL2的Third列有空白值有关。所以,在QEL2中,我把它放在WHERE子句中:

And  length(RTRIM(GMSUB)) > 2

而且,是的,我将查询中的列名从第一,第二,第三更改为更有意义的:)

因此,WHERE子句现在会强制在最终查询中查询一些值。这是最后的查询 - 再次,列名已被更改。

<cfquery name="qFinal" dbtype="query"> 
        SELECT 
        qEL.ELINKACCOUNTNUMBER AS ELAccountNum, qEL.WINACCNT AS WSAccountNum, qEL2.Description AS DESCRIPTION, qEL2.Posting_Edit_Code AS Posting_Edit_Code

        FROM 
        qEL, qEL2

        WHERE               
        CAST(qEL.WSTREAMBUSINESSUNIT AS INTEGER) = CAST(qEL2.WSBusinessUnit AS INTEGER)
        AND 
        CAST(qEL.WSTREAMOBJ AS INTEGER) = CAST(qEL2.WSBusinessObject AS INTEGER)
        AND
        CAST(qEL.WSTREAMSUB AS INTEGER) = CAST(qEL2.WSBusinessSub AS INTEGER) 


  </cfquery>

谢谢大家!我的回答肯定是您的反馈/输入的组合。