sql server left join

admin1233

New member
sql server left join

צהריים טובים,נתקעתי בבעיה בשליפת נתונים משתי טבלאות
טבלה אחת בשם Addition אשר מכילה AdditionId מסוג INT וAdditionName מסוג NVARCHAR(50) בנוסף ברשותי טבלה VehicleExtras אשר מכילה CarId מסוג int ומכילה AdditionId מסוג int
ברשותי לבצע שליפה של כל התוספות מהטבלה Addition אשר אינן נמצאות אצל רכב מסוים ניסיתי לבצע זאת אך לא הצלחתי,תודה מראש לעוזרים
השאילתה שכתבתי:
SELECT DISTINCT Additions.AdditionId, Additions.AdditionInfo
FROM Additions LEFT OUTER JOIN
VehicleExtras ON VehicleExtras.AdditionId = Additions.AdditionId
WHERE (Additions.AdditionId <> 0) AND (VehicleExtras.CarId = @CarId)
 

גרי רשף

New member
תשובה בשני חלקים

התשובה לשאלתך - התנאי ב-Where צריך להיות:
SELECT Additions.AdditionId, Additions.AdditionInfo
FROM Additions LEFT OUTER JOIN
VehicleExtras
ON VehicleExtras.AdditionId = Additions.AdditionId
AND VehicleExtras.CarId = @CarId
WHERE Additions.AdditionId Is Null​
שים לב לכלל חשוב: ברגע שיש ב-Where תנאי על הטבלה השנייה, זו שבצד ה-Left (במקרה זה - VehicleExtras), השאילתה הופכת למעשה ל-Inner Join. התנאי על הטבלה השמאלית צריך להופיע במקרה זה ב-On ולא ב-Where.
כלל שני אם כך: ב-Inner Join אין הבדל אם התנאי ב-Where או ב-On, אך ב-Left Join כן.
לבסוף- במקרה זה ה-Distinct מיותר.
&nbsp
נקודה שנייה לאחר שצלחנו את הנ"ל: מבחינת יעילות הקוד, הדרך הנכונה מבחינת היעילות לכתוב את השאילתה היא:
Select *
From Additions
Where Not Exists (Select * From VehicleExtras Where VehicleExtras.AdditionId=Additions.AdditionId And VehicleExtras.CarId = @CarId);​
אין צורך למצוא את כל ההתאמות ואז לפלטר אותן,
אלא למצוא את כל המקרים בהם אין התאמות.
 
למעלה