חסר נתון קריטי והתשובות שקיבלת בהתאם
1. מה זה אומר "עשיתי שאילתה"
איזה שאילתה בדיוק?!?
לא ניתן לנתק חלק מהשאילתה מה"סך הכל". המכלול הוא לא תמיד חיבור של נקודות, והשאילתה הפנימית שלך בה מצאת את הרשומות המקוריות היא חלק מהשאילתה הסופית.
* הרעיון של התבססות על שאילתה פנימית ומסביבה להוסיף שאילתה סוגרת (זה הרעיון שניתן כאן) הוא רעיון טוב להגיע לפתרון ולהבנה של הבעיה בדרך כלל. הוא גם יעיל למצב בו החלק הפנימי אינו ידוע (כמו שקרה כאן בגלל מחסור במידע בשאלה) אבל הוא ממש אינו מהווה פתרון טוב או מיטבי בדרך כלל בלי מבט כולל על השאילתה.
השאילתה שהציעו לך:
SELECT Id,Name
FROM #TMP
WHERE Id IN(SELECT Id+1 FROM #TMP WHERE Id IN (3,8,11,14))
זהה לחלוטין לשאילתה הבאה למשל:
SELECT Id,Name
FROM #TMP
WHERE Id-1 IN (3,8,11,14)
ההבדל במשאבים בין 2 השאילתות ענק! אם מה שרוצים זה את ה ID הקטן יותר אז אפשר כבר בשאילתה המקורית לבקש את ה ID-1 המתאים כפי שאתה רואה בשאילתה ש נייה.
2. האפיון שלך מאוד בעייתי או לא מלא. מה אתה רוצה לקבל במקרה שרשומה נמחקה? למשל נמחוק את רשומה עם ה id = 12 מהטבלה. מה התוצאה שאתה רוצה לקבל כרגע?
לדוגמה: אתה רוצה לקבל את ה ID "שורה אחת מעל" (זו הגדרה בעייתית) ז"א לפני המחיקה דובר על ID = 12 אבל עתה כמחקנו את רשומה זו האם אתה רוצה לקבל את ID = 13 שהוא זה שעתה "שורה אחת מעל" או שאתה רוצה שלא יחזור כלום כי אין ID שהוא בדיוק אחד מעל
* השאילתות שנתנו לך כאן לא יחזירו "שורה אחת מעל" כמו שביקשת, אלא רק את ה ID עם מספר אחד גדול יותר אם הוא קיים. אם ID זה לא קיים הן לא יחזירו את הרשומה "מעל". אחת השיטות אם אתה רוצה תמיד לקבל "שורה אחת מעל" אתה יכול לעבוד עם פונקציית row_number למשל. בגרסת 2012 אתה פשוט עובד עם פונקציית leg או lead. בשרתים ישנים יותר כמו 2000 אתה יכול לעבוד עם שאילתה פנימית. בשרתים מ 2005 אתה יכול לעבוד עם CTE ויש עוד הרבה אפשרויות בהתאם לגרסת השרת איתו אתה עובד.
3. "שורה אחת מעל" היא הגדרה בעייתית כי אתה לא קבעת את הסדר של הרשומות ולכן אין לנו שום יכולת לנחש מה זה מעל או מתחת. בכלל במסדי נתונים אין מעל או מתחת אלא לפני ואחרי. יש סדר ולא גובה
אנחנו מציגים בדרך כלל רשומות מלמלעלה עד למלטה לפי הסדר. כך שמעל הוא דווקא רשומה לפני ומתחת היא הרשומה אחרי.
* תוסיף בכל שאילתה שלך את הסידור המתאים אם אתה צריך סדר מסויים.