我有第二个查询,列名出现了,我想在主查询中插入数据。我已设法将第二个查询的所有列都带到主查询中,但所有新添加的列的数据都是空的。
现在,我正在尝试遍历第一个查询,并尝试找到存在的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,
usertype,
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-bc6b-424bd076f6e7'
, 'd047adf1-a6af-891e-94a2d0b225dcd1b6'
, '2aba38f2-d7a7-0a7a-eff2be3440e3b763'
)
答案 0 :(得分:1)
<强>更新强>
用新鲜的眼睛再次看着它,看起来似乎你可能过于复杂了?简单的JOIN应该返回所需的信息,即所有用户和完成的培训信息(如果有的话)。
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="...">
仅显示每个用户的名称一次,并在其下方显示已完成的培训课程列表(请参见下文)。如果您需要更具体的建议,请发布所需输出的示例。
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。