OK זה נראה שאני היחיד שמכיר - ויש לי טריקים נוספים אפילו . . . <!-- s8-) --><img src="{SMILIES_PATH}/icon_cool.gif" alt="8-)" title="מגניב" /><!-- s8-) -->
אגב שלא תגידו שלא אמרתי - התכונה הזו כמעט בת עשר (מ 2005) . . .
ואני הקטן אנסה להסביר:
הגדרה של CTE עשית על ידי שימוש במילה WITH כמו בדוגמה
היא מגדירה למעשה VIEW זמני שקיים רק עד אחרי שמתשאלים אותו פעם אחת ואז נעלם
תכונה ייחודית שלו היא שאפשר לקרוא ל VIEW מתוך עצמו מה שלמעשה הופך אותו לבעל יכולת רקורסיבית
מעבר לכך הכל פועל כמו שאילתה רגילה
בשורה הראשונה אתה למעשה בוחר את השורה הראשונה שלך ואז ב UNION מחבר אליה את הבאות בתור
לפי הלוגיקה שלך לדוגמה אם בחרת יום מסוים תרצה לחבר אליו את היום הבא או הקודם וכו'
דבר נוסף שצריך לשים לב לשים TERMINATOR כמו בכל רקורסיה, אחרת ב 100 הוא עף או שמגדירים MAX RECURSION גדול יותר מ100
במקרה של הדוגמה שהובאה >5 זה הטרמינייטור
אחד הדברים המגניבים שזה משמש הוא עבור שליפת עץ מטבלה שטוחה ושרשור הנתיבים של העלים
לדוגמה אם יש טבלת עובדים ויש ID לכל עובד ועמודה שמכילה את ה ID של המנהל של אותו עובד וגם למנהל יש מנהל ולמעלה בקודש וכו'
לבנות מזה עץ ייראה בערך ככה : (אני ממליץ למי שרוצה להבין ליצור ממש טבלה ולנסות את השאילתה)
WITH cte (ID,MID,path) AS
(
SELECT [EmployeeID],[ManagerID], CAST([First Name] + ' ' + [Last Name] AS NVARCHAR(MAX))
FROM Employees WHERE [ManagerID] IS NULL
UNION ALL
SELECT [EmployeeID],[ManagerID],
CAST(path + '\' + [First Name] + ' ' + [Last Name] AS NVARCHAR(MAX))
FROM Employees INNER JOIN cte ON ID = [ManagerID]
)
SELECT * FROM cte
הקוד הזה בוחר את הבוס כשורה ראשונה ואז בריקורסיה יורד בעץ הארגוני עד שלעובד אין יותר JOIN לכפופים לו
מקווה עזרתי ולא בלבלתי . . .
פורסם במקור בפורום CODE613 ב30/07/2014 23:17 (+03:00)