我在做如下。它正确地更新了所需的行,但它也在" UserID"中更新了其他行。 Testcases_projects表中的列。
我哪里错了?
- 使用循环表中的userID
更新Projects表中的userIDPrivate pCornerCell As String
Private pRecordset As ADODB.Recordset <-- PROBLEM HERE
Private pSheet As Worksheet
答案 0 :(得分:0)
WHERE
子句指的是与相关子查询不同的列:
UPDATE dbo.TestCases_Projects
SET UserID = (SELECT tempdata.UserID
FROM tempdata td
WHERE dbo.TestCases_Projects.TestCases_ProjectsID = td.TPID),
-------------------------------------------------------------------------^
AssignedOn = GETDATE()
WHERE ProjectID = 10500 AND
Testcases_ProjectsID IN (SELECT Testcases_ProjectsID FROM tempdata)
--------------------------------------^
这些应该是相同的,大概是TPID
:
UPDATE dbo.TestCases_Projects
SET UserID = (SELECT tempdata.UserID
FROM tempdata td
WHERE dbo.TestCases_Projects.TestCases_ProjectsID = td.TPID),
AssignedOn = GETDATE()
WHERE ProjectID = 10500 AND
Testcases_ProjectsID IN (SELECT td.TPID FROM tempdata td);
为什么temptdata.Testcases_ProjectsID
不存在时您的原始查询有效?这是由于SQL中的范围。该条件最终被解释为:
Testcases_ProjectsID IN (SELECT dbo.TestCases_Projects..Testcases_ProjectsID FROM tempdata td);
对于所有非NULL
值都是如此。
答案 1 :(得分:0)
这称为偶然相关子查询。在你的代码中
...
Testcases_ProjectsID IN (SELECT Testcases_ProjectsID FROM tempdata)
列不以表名(别名)作为前缀。因此,Testcases_ProjectsID
都被解析为TestCases_Projects.Testcases_ProjectsID
,因为tempdata
没有此列。
使用显式别名,它会保持代码清洁并防止像这样的错误。 SELECT td.Testcases_ProjectsID FROM tempdata td
只是无法编译,您将收到明确的错误消息,而不是意外的结果。