הבלוג של גרי רשף

20/06/2010

ערכים ברשימה שאינם מופיעים בטבלה

Filed under: Uncategorized — תגיות: , , , — גרי רשף @ 14:52

במקום העבודה שלי משתמשים באוראקל..
חז"ל כבר פסקו שמוטב לפשוט נבלה בשוק מלהזדקק למתנת בשר ודם, אז קל וחומר שמותר בשעת הדחק לעבוד עם אוראקל..
(זה נאמר כמובן בחיוך – אינני מזלזל חלילה במתחרים!).
פנה אלי חבר מצוות הפיתוח בשאלה כיצד ניתן למצוא אילו ערכים ברשימה שבידו (רשימת ערכים מופרדים על ידי פסיקים) אינם מופיעים בטבלה; כלומר- לא המקרה הרגיל של Select * From .. Where .. Not In אלא המקרה ההפוך בו מחפשים מה נמצא ברשימה שבסוגריים אך לא בטבלה.
הרהרתי ארוכות ואמרתי לו שלדעתי אין לזה פתרון, זולת להכניס את הרשימה לעורך טקסטואלי, להפוך אותה לסט תוך שימוש ב-Select וב-Union בין הערכים, ומזה לשלוף את מה שאינו בטבלה.
ליתר בטחון הפניתי אותו להתייעצות עם ה-DBA-ים, וחיש וידאתי שב-SQL Server זה אפשרי בעזרת CTE רקורסיבי..

ניצור טבלה עם מספר ערכים:

If Object_Id('T_Try001') Is Not Null Drop Table T_Try001;

Go


Create Table T_Try001(ID Int Identity Primary Key,

                    Shem Varchar(Max));

Go


Insert Into T_Try001(Shem)

Select    'Avi'

Union All

Select    'Bat Sheva'

Union All

Select    'Galit'

Union All

Select    'David';

כעת נחפש מי מהרשימה הבאה – David,Roni,Lea,Bat Sheva – אינו מופיע בטבלה (צריכים לקבל את Roni,Lea):

Declare    @S Varchar(Max)

Set        @S=',David,Roni,Lea,Bat Sheva,';

With T As

(Select    ROW_NUMBER() Over(Order By ID) Mispar,

        *

From    T_Try001),

T1 As

(Select    Cast(1 As Int) Mispar,

        Replace(@S,','+Shem+',',',') S

From    T

Where    Mispar=1

Union All

Select    Cast(T.Mispar As Int),

        Replace(T1.S,','+T.Shem+',',',') S

From    T1

Inner Join T

        On T1.Mispar+1=T.Mispar)

Select    Top 1 *

From    T1

Order By Len(S)

option (MaxRecursion 0);

השליפה מורידה מ-S את מה שכן, ומשאירה לבסוף (לבסוף = השורה עם S הכי קצר) את מה שלא.

לרשימה הוספתי ,פסיקים, לפני ואחרי לצורך החיפוש, וניתן להוריד אותם מהתוצאה אם אין בהם צורך.

אפשר, כמובן, לבצע Split לרשימה ולתוצאה להוסיף תנאי Where Not In המתייחס לטבלה.

ההגינות מחייבת לציין שלאוראקל יש כלי שדומה ל-CTE רקורסיבי, אך לא בגרסה שמותקנת אצלנו.

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: