לאחר שקראתם את הכותרת- אתם יודעים מה אני הולך להראות.
ניצור שתי טבלאות צנועות:
Use tempdb;
Go
Create Table Tbl1(I Int);
Go
Insert
Into Tbl1
Select 1 I Union All
Select 1 I Union All
Select 2 I Union All
Select 2 I;
Go
Create Table Tbl2(I Int);
Go
Insert
Into Tbl2
Select 1 I;
Go
Select * From Tbl1;
Select * From Tbl2;
Go
וכעת נבצע Except (כלומר- נחסיר מהראשונה את השניה):
Select * From Tbl1
Except
Select * From Tbl2;
Go
העובדה ש-1 בטבלה השניה קיזז פעמיים 1 בראשונה – אפשר להבין,
אבל מדוע ה-2 הכפול הצטמצם לשורה אחת?
אין זאת אלא שהמערכת מבצעת Distinct לפני ה-Except:
למי שזה לא מתאים לו- אפשר לאלתר פתרון:
Select Row_Number() Over(Partition By I Order By I),* From Tbl1
Except
Select Row_Number() Over(Partition By I Order By I),* From Tbl2;
Go