שאלה מראיון SQL

מי נהר2

New member
שאלה מראיון SQL

נתונה טבלה עם עמודה אחת. העמודה מכילה רצף של מספרים עולים בטווח ידוע. לדוג 1-100.
ישנו מספר חסר ברצף.
צריך לכתוב שאילתא שתחזיר את המספר החסר.
האם השאילתא תעבוד במקרה שחסרים כמה מספרים?

בעקרון, כתבתי פתרון שמשתמש בטבלת עזר ובIN. ואז המראיין אמר לי שהוא מחפש פתרון בלי טבלת עזר שמשתמש בJOIN.
ואז ניסיתי לחשוב על פתרון נוסף של JOIN עצמי עם קידום של הרשומה ב1.

אשמח אם מישהו יוכל לכתוב לי את השאילתא המדויקת..

תודות.
 
תשובה לשאלתך

היי,

אם אני לא טועה מה שהיית צריך לרשום זה ככה.

select * from table where number is null.

כך למעשה השאילתא תציג לך את כל הנתונים או במקרה זה נתון אחד שהוא ללא ערך, ז"א NULL.
 

מי נהר2

New member
אין NULL בטבלה

כנראה לא הייתי ברורה מספיק.
אני אתן דוגמה-
נניח שהטווח הוא 1-7
הטבלה תכיל את המספרים:1,2,3,5,6,7
וצריך לכתוב שאילתא שתחזיר את המספר החסר, במקרה הנל-4
 

גרי רשף

New member
אני הייתי בוחר ב-Join עצמי

אם חסר רק ערך אחד- ניתן למצוא אותו בעזרת השאילתה.
אם חסרים כמה ערכים- ניתן למצוא כך את נקודות ההתחלה והסיום של כל מרווח (למשל- אם חסרים 10,11,12,13 ניתן לקבל כך את 10 ו-13).
 

pitoach

New member
השאלה הזו היתה כאן בפורום לפני כשבועיים

אני מניח שאתה לא היחיד שניגש לראיון שם והם שואלים את כולם אותו דבר אולי?!? כדאי למצוא את השירשור הקודם.

אני חושב שתמצא שיותר יעיל להגיע לפתרון הסופי בשאילתה אחת פשוטה של LEFT JOIN

הקדמה: בכל שרת יש כמה דברים שכדאי מאוד להחזיק בקביעות לשימושים שונים, ואחד מהדברים הוא טבלה של מספרים. למעשה אפילו מייקרוסופט הכירו בכך והכינו לנו טבלה כזו בין טבלאות המערכת, אבל אני לא זוכר אף פעם היכן היא ואני מעדיף להכין טבלה שלי

אז אחרי ההקדמה הזו אם יש לך טבלת מספרים מאונדקסת כל מה שצריך זה LEFT JOIN של טבלת המספרים עם הטבלה שלך. כל נתון חסר בטבלה שלך יהיה NULL בחיבור הנתונים. לכן כל מה שיש לבצע זה סינון למספרים בין הקטן ביותר לגדול ביותר שיש לך בטבלה + סינון לבחור את ה NULL בלבד.

* ישנם עוד שיטות במקום LEFT JOIN למצוא את הנתונים החסרים תוך התבססות על טבלת מספרים
 

pitoach

New member
וכמובן כדאי לקרוא על EXCEPT ועל INTERSECT

שיכולים לעזור מאוד בשאילתה של מציאת המספרים שנמצאים בטבלת המספרים וחסרים בטבלה שלך
 

pitoach

New member
תיקון: זה לא בפורום כאן אלא עניתי על זה

ב MSDN כששאלו על זה
מצאתי כרגע את התשובה שלי שם

* אם אתה מתקשה בפתרון תגיד לנו היכן נתקעת
 

מי נהר2

New member
כמו שכתבתי

בראיון עצמו כתבתי פתרון עם טבלת עזר והמראיין ראה וביקש ממני לחשוב על פתרון אחר ללא טבלה נוספת ובעזרת JOIN.
האמת שאתמול חשבתי על זה שוב והיה לי רעיון כזה-

select numbers.num+1
from numbers
where numbers.num+1 not in (select numbers.num)


זה טיפה בעייתי כי זה גם מחזיר את הקצוות וזה גם לא משתמש בJOIN כמו שהמראיין כיוון.
למישהו יש מושג למה הוא כיוון??
 

מי נהר2

New member
ואני גם אשמח

לקבל קישור לדיון שאתה מדבר עליו..אם זה לא בעייתי מבחינת החוקים בפורום כמובן.
 

pitoach

New member
אני יכול לפרט כל מה שרשמתי שם גם כאן ->

אבל אתה מבקש משהו שהוא לא מיטבי ושם לא עלה תנאי כזה שהוא למעשה תנאי לא מעשי כי הוא קובע לך למצוא פתרון לא מיטבי.

בכל מקרה אם המראיין (או הלקוח) קבע נתונים מסויימים אז חייבים לעבוד לפיהם אבל באופן חד משמעי כדאי גם להציג לו את הפתרון היעיל יותר שהוא שימוש בטבלת מספרים

גם השימוש בטבלת מספרים עושה שימוש ב JOIN אבל אם אסור לעשות שימוש בטבלה נוספת (וזה אבסורד כי אתה יכול ליצור טבלה נוספת כחלק מהפתרון) אבל אפשר ליצור טבלת מספרים בצורה דינאמית כחלק מהשאילתה. כמובן שזה פחות יעיל אבל אפשרי. כמו כן ניתן לעבוד במקרה זה בצורה שגרי הציע (זה פחות יעיל אבל שוב אם אלו מגבלות הראיון אז הפתרון של גרי הופך לאחד היעילים)

* דוגמה (לא מיטבית אלא דינאמית): ניתן לבנות טבלת מספרים ב CTE ואז לגשת אליה בהמשך השאילתה לשם ה JOIN עם הטבלה שלך למציאת המספרים שאתה מחפש.
ariely.info/Blog/newForumsFAQ/ForumsFAQ355/tabid/165
 

dror0548

New member
תשובה

Select A.id + 1
from Table_2 A
Left Join Table_2 B
On A.id = B.id - 1
Where B.id is null


אם חסר כמה מספרים אבל הפער תמיד הוא 1 הוא ימצא אותם
אחרת לא
 

pitoach

New member
אבל זה לא ייתן לך את כל המספרים החסרים!

במקרים שיש חור של למעלה מאחד לא תקבל את התשובה כל כך מהר וזה החלק היחיד שעליו אנחנו דנים. את הפתרון הזה הציג גרי כבר בהתחלה (במילים).

* למעשה זה השלב הראשון בפתרון של שימוש ב self join והשלב הבא הוא השלב היקר מאוד מבחינת משאבים והופך את השיטה הזו ללא יעילה והשמוש בטבלת מספרים ליותר יעיל (טבלה קבועה מאונדקסת כמובן ולא דינאמית כמו שבסוף הצגתי רק כאופציה)
 

pitoach

New member
תבדוק את עצמך עם כמה חורים ואחר כך עם

חורים בגודל של מעל לאחד גם כן
 

rnan

New member
אם אני לא טועה הוא רשם שחסר 1... ואני לא טועה

"ישנו מספר חסר ברצף."

ולא זה לא יעבוד אם יש כמה.

זה לא בעיה לסדר את זה שיעבוד עם כמה
 
למעלה