SQL更新第二张表中的条件变量检索的第一张表

时间:2019-08-27 08:57:36

标签: sql sql-server

我正尝试通过以下逻辑更新statusId表中的T1

update t1.statusId with (t2.statusId where t2.statusName = closed) where t1.RecordId = 999

以下是我当前的查询:

UPDATE 
    [DB].[T1]

SET
    [DB].[T1].StatusId = t1.StatusId

FROM
    [DB].[T1] t1

LEFT JOIN [DB].[T2] t2
    ON t1.StatusId = t2.StatusId

WHERE t1.RecordId= 999

AND t2.StatusName = 'Closed'

Q:,查询无法在T1中找到要更新的特定记录,因为它当前是statusId而非{{ 1}}。

我认为我的statusId查询是错误的,我应该将Closed取出以另一种方式进行处理。

4 个答案:

答案 0 :(得分:0)

认为,这是你追求的:

UPDATE T1
SET StatusID = (SELECT T2.StatusId FROM [SCHEMA].T2 WHERE T2.StatusName = 'Closed')
FROM [SCHEMA].T1 T1
WHERE T1.RecordId = 999;

您正在使用T2中行的当前状态加入T1,这意味着您只会将已关闭的行更新为已关闭;使其毫无结果。

(由于[DB].[T1]令人困惑,我为对象(好的模式)使用了不同的名称。由于DB是模式而不是数据库,并且显然是匿名的对象名称。)< / p>

答案 1 :(得分:0)

我认为您正在寻找这样的东西:

UPDATE [DB].[T1]
SET StatusId = (
    SELECT StatusId
    FROM [DB].[T2]
    WHERE StatusName = 'Closed'
)
WHERE RecordId= 999

答案 2 :(得分:0)

您应该尝试以下操作

UPDATE [DB].[T1]
SET StatusId = (
    SELECT top 1 StatusId
    FROM [DB].[T2]
    WHERE StatusName = 'closed'
)
WHERE RecordId= 999

注意:-您应该在子查询中选择前1个,否则它可能会返回多个记录,并且会出现错误。

答案 3 :(得分:0)

您可以使用join来执行此操作,但是它看起来像这样:

UPDATE t1
    SET StatusId = t2.StatusId
FROM [DB].[T1] t1 JOIN
     [DB].[T2] t2
     ON t1.RecordId = 999 AND
        t2.StatusName = 'Closed';

或者:

UPDATE t1
    SET StatusId = t2.StatusId
FROM [DB].[T1] t1 CROSS JOIN
     [DB].[T2] t2
WHERE t1.RecordId = 999 AND
      t2.StatusName = 'Closed';

(两者相同。)