将列值从一个表复制到另一个表

时间:2012-06-06 08:21:11

标签: sql-server tsql copy

我正在尝试创建几个小时的T-SQL查询。谷歌和论坛搜索没有帮助,所以我希望有人可以帮助我。

有两个表,ChangeJournalChange中的每一行在Journal中都有5个相关行。

我想要做的是将CreatedDateTime中特定相关行的列值(Journal)复制到AuthorizationDate的列Change中。应该对Change中的所有行执行此操作。

这是我到目前为止所取得的成就:

UPDATE Change 
SET Change.ap_ITSM_MDP_AuthorizationDate = 
    ( SELECT Journal.CreatedDateTime 
      FROM Journal 
        JOIN Change 
          ON Journal.Parentlink_RecID = Change.RecID 
      WHERE ITSM_ChangeNotes_Subject = 'Status changed to: Authorized' 
        AND Change.RecID = Journal.ParentLink_RecID
    )

不幸的是,我收到以下错误消息:

  

Msg 512,Level 16,State 1,Line 1   子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。   声明已经终止。

我以为我DID通过WHERE子句(ChangeNotes_Subject = '...')将结果限制为1。我做错了什么?

3 个答案:

答案 0 :(得分:3)

我认为这会奏效:

UPDATE Change 
SET Change.ap_ITSM_MDP_AuthorizationDate = 
    ( SELECT Journal.CreatedDateTime 
      FROM Journal 
      WHERE ITSM_ChangeNotes_Subject = 'Status changed to: Authorized' 
        AND Change.RecID = Journal.ParentLink_RecID
    ) ;

但使用JOIN更好 - 避免任何不必要的更新。方法如下:

UPDATE Change 
SET Change.ap_ITSM_MDP_AuthorizationDate = Journal.CreatedDateTime 
FROM Journal 
  JOIN Change 
    ON Change.RecID = Journal.ParentLink_RecID
WHERE ITSM_ChangeNotes_Subject = 'Status changed to: Authorized' ;

答案 1 :(得分:1)

正如您所说,您的日记有五个条目用于更改的一个...使用您的子查询中的前1或最大来证明您可以使其工作。然后你必须考虑哪些日记条目从日期时间开始,并改变你的子选择只选择它。

哦,你的“where”子句重复你的联接,丢弃那部分。此外,哪个表位于“ITSM_ChangeNotes_Subject”,如果它位于Change中,这可能是您在返回的Journal行中看到重复的原因。

使用示例更改ID运行子查询,以查看是否确实为搜索字符串获取了重复的行。

答案 2 :(得分:0)

UPDATE Change 
SET Change.ap_ITSM_MDP_AuthorizationDate = 
    ( SELECT TOP 1 Journal.CreatedDateTime 
      FROM Journal 
        JOIN Change 
          ON Journal.Parentlink_RecID = Change.RecID 
      WHERE ITSM_ChangeNotes_Subject = 'Status changed to: Authorized' 
        AND Change.RecID = Journal.ParentLink_RecID
    )

注意:小心使用这个查询,因为子查询只返回一行你想要的行,我有疑问。