2

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

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

我想要做的是将CreatedDateTime特定相关行的Journal列值 ()AuthorizationDateChange. 这应该对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
    )

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

消息 512,级别 16,状态 1,第 1 行子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。该语句已终止。

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

4

3 回答 3

5

我认为这会起作用:

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' ;
于 2012-06-06T08:26:44.570 回答
1

正如您所说,您的日记有五个条目用于更改的条目...在您的子查询中使用 top 1 或 max 来证明您可以完成这项工作。然后,您必须考虑从哪些日记条目中获取日期时间,并更改您的子选择以仅选择该条目。

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

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

于 2012-06-06T08:25:36.427 回答
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
    )

注意:小心使用此查询,因为子查询将仅返回您是否期望的一行,我对此表示怀疑。

于 2012-06-06T09:26:10.510 回答