2

T-SQL クエリを数時間作成しようとしています。Googleとフォーラムの検索は役に立たなかったので、誰かが私を助けてくれることを願っています.

と の 2 つのテーブルがChangeありJournalます。の各行にChangeは、関連する 5 つの行がありJournalます。

私がしたい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
    )

残念ながら、次のエラー メッセージが表示されます。

メッセージ 512、レベル 16、状態 1、行 1 サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。ステートメントは終了されました。

WHERE句()で結果を1つに制限したと思いました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

あなたが言ったように、ジャーナルには変更のエントリが 5 つあります... サブクエリで上位 1 または最大を使用して、これを機能させることができることを証明します。次に、どのジャーナル エントリから日時を取得するかを検討し、サブセレクトを変更してそれのみを選択する必要があります。

ああ、「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
    )

注:サブクエリは、あなたが期待するかどうかに関係なく1行しか返さないため、このクエリの使用には注意してください。

于 2012-06-06T09:26:10.510 に答える