האם ניתן לעדכן אותה שורה מספר פעמים בפקודה אחת?
הנה מקור לטעויות: מנסים לעדכן טבלה אחת על פי השניה, בשעה שלכל שורה בראשונה יש מספר שורות מתאימות בשניה.
עוד לפני שנראה מה קורה- ברור שלא זה הדרך: בין אם הפקודה תעבוד ובין אם לא- כיצד נדע איך הטבלה הראשונה תתעדכן?
לאחר שנראה מה קורה נבין שכל שורה תתעדכן פעם אחת באופן אקראי, וכך לא עובדים.
דוגמה:
Use tempdb;
Go
If Object_Id('MyTbl1','U') Is Not Null Drop Table MyTbl1;
Go
Create Table MyTbl1(ID Int,
Txt Varchar(50));
Go
Insert
Into MyTbl1(ID)
Select 1 Union All
Select 2 Union All
Select 3;
If Object_Id('MyTbl2','U') Is Not Null Drop Table MyTbl2;
Go
Create Table MyTbl2(ID Int,
Txt Varchar(50) Not Null);
Go
Insert
Into MyTbl2(ID,Txt)
Select 1,'a' Union All
Select 1,'b' Union All
Select 1,'c' Union All
Select 2,'aa' Union All
Select 2,'bb' Union All
Select 2,'cc' Union All
Select 3,'aaa' Union All
Select 3,'bbb' Union All
Select 3,'ccc';
Select * From MyTbl1;
Select * From MyTbl2;

כפי שניתן לראות- לכל ID מהטבלה הראשונה יש שלוש שורות בטבלה השניה, וכעת ננסה לעדכן:
Update MyTbl1
Set Txt=MyTbl2.Txt
From MyTbl1
Inner Join MyTbl2
On MyTbl1.ID=MyTbl2.ID;
Select *
From MyTbl1;

אולי - חולף בנו הרהור - כל שורה התעדכנה שלוש פעמים, וזה הערך האחרון שנשאר?
ננסה אם כך לצבור בכל שורה בטבלה הראשונה את הערכים שהוכנסו לתוכה-
נאפס את עמודה Txt בטבלה הראשונה ונבדוק:
Update MyTbl1
Set Txt=Null;
Update MyTbl1
Set Txt=IsNull(MyTbl1.Txt,'')+MyTbl2.Txt
From MyTbl1
Inner Join MyTbl2
On MyTbl1.ID=MyTbl2.ID;
Select *
From MyTbl1;

אין כל שינוי.
מי שטיפה יתעמק- יוכל לראות שכל שורה קיבלה באופן מעשי את הערך הראשון שהגיע אליה, אבל פורמלית מדובר בבחירה אקראית של המערכת.
מי שעדיין יש לו ספק- יוכל לעיין ב-Execution Plan:

המערכת מבצעת אגרגציה ומחשבת Top לכל ID בטבלה השניה מכיוון שהיא מזהה שיש ריבוי של שורות לכל ID.
האם זה נכון? מצד אחד- התהליך לא נופל ומקבלים תוצאה שהיא לא יותר נכונה ולא פחות נכונה מהתוצאות האפשריות האחרות, מצד שני- אם יש כמה תוצאות אפשריות אזי כולן לא נכונות..