尝试将数据插入特定列和查询中的行

时间:2016-08-21 16:59:12

标签: coldfusion coldfusion-10

我有第二个查询,列名出现了,我想在主查询中插入数据。我已设法将第二个查询的所有列都带到主查询中,但所有新添加的列的数据都是空的。

现在,我正在尝试遍历第一个查询,并尝试找到存在的uuid,以便在找到的特定column和特定row处插入特定数据在uuid搜索。这是我现在的尝试:

<cfset lstusers = '51840915-e570-430d-9911-7247d076f6e7,5200915-g675-430d-9911-7247d076f6e7,56674915-e570-430d-9911-7247d076f6e7,2134563-e570-430d-9911-7247d076f6e7'>
<cfloop query="quserList">
    <cfdump var="#quserList.uuid[currentRow]#">
    <cfif ListContainsNoCase(lstusers,quserList.uuid[currentRow])>          
        <cfset QuerySetCell(quserList,"BUFFEREDRANGENOTES","name",quserList[uuid][currentRow])>
        <cfset QuerySetCell(quserList,"BufferNotes","name2",quserList[uuid][currentRow])>
    </cfif>
</cfloop>
    </cfif>

然而,它在quserList[uuid][currentRow]行上给出了一个错误,该错误说明数据无法转录:

  

coldfusion.sql.QueryColumn@276249a2]]不可索引   51840915-e570-430d-9911-7247d076f6e7

如果我以其他方式尝试:

quserList.uuid[currentRow]

我仍然收到错误,但它说'#34;无法转换为int ...&#34;。我该如何解决?

更新

在图1中,我正在为主查询中的所有上述第一个查询product_types创建一个创建列,并基于第一个查询的用户ID和第二个查询的uuid。我想根据uuid和userid匹配在正确的位置插入数据并为用户更正行。图2是第二个表中的uuid:

在这两个查询中,您在第一部分中看到的用户标识很常见。意味着下面存在相同的usedid,告诉我们该用户已完成这些培训。现在我希望第一个查询在第二个查询中合并,因此它应该将正确的数据添加到正确的行中,这就是搞砸了我。

SQL:

查询#1:

SELECT ct.trainingid,
       ct.userid,
       ct.trainingtype,
       ct.trainingstatus,
       ct.trainingscore,
       ct.trainingdate,
       dbo.Fn_stripcharacters(ctt.product_type, '^a-z0-9') AS product_type,
       ctt.product_type AS oldName
FROM   clienttraining AS ct
       INNER JOIN clienttraningtypes AS ctt ON ct.trainingtype = ctt.typeid
WHERE  1 = 1
       AND userid IN ( 
          '51840915-e570-430d-9911-7247d076f6e7'
          , '51927ada-6370-4433-‌​8a06-30d2d076f6e7' 
       )
       AND trainingtype IN (
            SELECT typeid
            FROM   complaincetestlinks
            WHERE  pid = 1039
            AND    isactive = 1
            AND    isdeleted = 0
      )  

查询2:

SELECT id,
       NAME,
       username,
       email,
       password,
       first_name,
       last_name,
       usertyp‌​e,
       block,
       sendemail,
       registerdate,
       lastvisitdate,
       activation,
       params‌​,
       uuid
FROM   users
WHERE  uuid IN ( 
       '51840915-e570-430d-9911-7247d076f6e7'
      , '51912193-6694-4ca5-‌​94c9-9f31d076f6e7'
      , '51927ada-6370-4433-8a06-30d2d076f6e7'
      , '51c05ad7-d1d0-4eb6-b‌​c6b-424bd076f6e7'
      , 'd047adf1-a6af-891e-94a2d0b225dcd1b6'
      , '2aba38f2-d7a7-0a7a-ef‌​f2be3440e3b763' 
)  

1 个答案:

答案 0 :(得分:1)

<强>更新

用新鲜的眼睛再次看着它,看起来似乎你可能过于复杂了?简单的JOIN应该返回所需的信息,即所有用户和完成的培训信息(如果有的话)。

Runnable SQLFiddle

SELECT u.id
       , u.first_name
       , u.last_name
       , ct.trainingid
       , ct.userid
       , ct.trainingtype
       , ct.trainingstatus
       , ct.trainingscore
       , ct.trainingdate
       , ctt.product_type
       , ctt.product_type AS oldName
FROM   users u 
      LEFT JOIN clientTraining AS ct ON ct.UserID = u.UUID
      LEFT JOIN clientTraningTypes AS ctt ON ct.trainingtype = ctt.typeid
      LEFT JOIN (
             SELECT typeID
             FROM   complainceTestLinks
             WHERE  parent_client_id = 1039
             AND    isactive = 1
             AND    isdeleted = 0
          ) ctl ON ctl.TypeID = ct.trainingType
WHERE  u.uuid IN 
( 
       '51840915-e570-430d-9911-7247d076f6e7'
      , '51912193-6694-4ca5-94c9-9f31d076f6e7'
      , '51927ada-6370-4433-8a06-30d2d076f6e7'
      , '51c05ad7-d1d0-4eb6-bc6b-424bd076f6e7'
      , 'd047adf1-a6af-891e-94a2d0b225dcd1b6'
      , '2aba38f2-d7a7-0a7a-eff2be3440e3b763' 
)  
ORDER BY last_name, first_name, product_type
;

如何呈现前端的信息是不同的问题。例如,您可以使用<cfoutput group="...">仅显示每个用户的名称一次,并在其下方显示已完成的培训课程列表(请参见下文)。如果您需要更具体的建议,请发布所需输出的示例

  • 史密斯,约翰
    • 课程1
    • 课程2
  • 艾伦,马克
    • 课程2
    • 课程3 ...
  

coldfusion.sql.QueryColumn@276249a2]]不可索引   51840915-e570-430d-9911-7247d076f6e7

这只是意味着您引用了一个不存在的列名。通过省略uuid这里的引号quserList[uuid][currentRow],您实际上是将变量 value 作为列名传递,而不是文字字符串“UUID”。显然,查询不包含名为“51840915-e570-430d-9911-7247d076f6e7”的列。因此错误。

  

它表示无法转换为int

这是非常自我解释的。您正在尝试使用非数字值填充数字列。显然,UUID字符串,即“51840915-e570-430d-9911-7247d076f6e7”不是整数。要么使用了错误的值,要么需要更改列类型。

这可能与您的QuerySetCell来电传入错误参数的事实有关。第三个和第四个参数应该是“值”并查询“行号”。但是,您的代码传入硬编码字符串中的“value”和UUID字符串而不是行数字

QuerySetCell(quserList,"BUFFEREDRANGENOTES","name",quserList[uuid][currentRow])

那就是说,技术上你甚至不需要那个功能。只需使用关联数组表示法来“设置”值,即<cfset queryName["columnName"][currentRow] = "some value here">

  

<cfif ListContainsNoCase(lstusers,quserList.uuid[currentRow])>

与错误无关,但ListContainsNoCase在这里是错误的功能,因为searches for partial matches。要仅匹配整个元素,请使用ListFindNoCase