在单个SQL查询 - SQL Server中更新具有不同值的多个行

时间:2017-07-26 21:45:41

标签: sql sql-server

我在做如下。它正确地更新了所需的行,但它也在" UserID"中更新了其他行。 Testcases_projects表中的列。

我哪里错了?

- 使用循环表中的userID

更新Projects表中的userID
Private pCornerCell As String
Private pRecordset As ADODB.Recordset    <-- PROBLEM HERE
Private pSheet As Worksheet

2 个答案:

答案 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只是无法编译,您将收到明确的错误消息,而不是意外的结果。