我正在尝试创建几个小时的T-SQL查询。谷歌和论坛搜索没有帮助,所以我希望有人可以帮助我。
有两个表,Change
和Journal
。 Change
中的每一行在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。我做错了什么?
答案 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
)
注意:小心使用这个查询,因为子查询只返回一行你想要的行,我有疑问。