如何从另一个表的列更新一个表的一列

时间:2014-03-03 20:07:15

标签: sql

我有一个名为UserProductDetails的表,其中UPID是主键,而UPID中另一个名为UserTasks的表只是可以为空的列。两个表都将UserID作为公共列。

对于任何特定用户,

UserProductDetails中的UPID可以是多个。

我想从UserProductDetails的任何UPID更新UserTasks.UPID。

我该怎么做?

我正在尝试下面的事情

update UserTasks
set UPID = 
select  MIN(UserProductDetails.UPID) AS UPID, GETDATE() from UserProductDetails where UserId in
(select UserID from UserTasks t) group by UserId

4 个答案:

答案 0 :(得分:1)

尝试:

UPDATE      UserTasks u
SET         u.UPID =  (SELECT MIN(up.UPID)      
                       FROM   UserProductDetails up 
                       WHERE up.UserID = u.UserID)

答案 1 :(得分:1)

最终根据Milen Pavlov的建议使用以下查询

/*Adding random but user specific UPID and then making UPID as non-nullable.*/
begin tran
UPDATE
    dbo.UserTasks
SET
    UPID = A.UPID
    FROM
 (SELECT UserId, MIN(CAST(UPID AS BINARY(16))) AS UPID FROM UserProductDetails GROUP BY UserId) A
WHERE userTasks.UserID = A.UserID
COMMIT

GO

答案 2 :(得分:0)

我认为您正在尝试更新UserTasks表上的两列 - 日期列和UPID列。如果是这种情况,则以下更新应该有效。它将日期列更新为GETDATE(),并选择与两个表上的UserID列匹配的UPID值之一。我已经使用了TOP 1,正如你所提到的那样。

UPDATE UserTasks
SET 
DateColumn = GETDATE(),
UPID = (SELECT TOP 1 UserProductDetails.UPID
        FROM UserProductDetails
        WHERE UserProductDetails.UserId = UserTasks.UserID)

答案 3 :(得分:0)

您的代码中存在三个问题。

  1. 您忘记了子选项周围的大括号
  2. 您的子选择只能返回一列
  3. 限制子选择以匹配外部查询
  4. 试试这个:

    update
        UserTasks
    set
        UPID = ( 
           select
               min(UserProductDetails.UPID) AS UPID
           from
               UserProductDetails
           where
               UserTasks.UserId = UserProductDetails.UserID
        )