如何从TSQL中的子查询创建Update语句

时间:2015-08-04 02:27:11

标签: tsql sql-server-2012

我需要更新符合我条件的所有记录。但是下面的Sql会出现此错误:

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。

-- Set MasterAccountId = NULL where there is no Receivable with equivalent BillingAccountId and TaskAccountId 
UPDATE R
SET R.MasterAccountId = NULL  
FROM Receivable R
WHERE EXISTS ( SELECT * FROM MasterAccount M 
                WHERE (ISNULL(M.BillingAccountId, 0) > 0 AND M.BillingAccountId = R.BillingAccountId) OR 
                      (ISNULL(M.TaskAccountId, 0) > 0 AND M.TaskAccountId = R.TaskAccountId))

基本上,我需要更新在subquery内返回的所有记录

有人知道如何解决它吗?

2 个答案:

答案 0 :(得分:1)

我不认为你在发布的查询中得到的错误可能在其他地方。再次在EXISTS子查询中,而不是说select * ...,最好说WHERE EXISTS ( SELECT 1 FROM MasterAccount M

另请尝试使用此查询的JOIN版本,而不是

UPDATE R
SET R.MasterAccountId = NULL  
FROM Receivable R
JOIN MasterAccount M ON M.BillingAccountId = R.BillingAccountId 
OR M.TaskAccountId = R.TaskAccountId
WHERE ISNULL(M.BillingAccountId, 0) > 0 
OR ISNULL(M.TaskAccountId, 0) > 0;

答案 1 :(得分:1)

你可以尝试一下吗?这是https://stackoverflow.com/users/40655/robin-day在此链接How do I UPDATE from a SELECT in SQL Server?上的{{3}}响应的基础。

UPDATE 
    R
SET
    R.MasterAccountId = NULL 
FROM
    Receivable R
INNER JOIN
    MasterAccount M
ON
    (ISNULL(M.BillingAccountId, 0) > 0 AND M.BillingAccountId = R.BillingAccountId) OR 
    (ISNULL(M.TaskAccountId, 0) > 0 AND M.TaskAccountId = R.TaskAccountId))