יעול שאילתה (SQL)

יעול שאילתה (SQL)

אני מחפש טכניקה יעילה יותר לבצע את הפעולה הבאה: נתונה טבלה (בעצם תוצאה של view) המכילה את השדות הבאים (אלו רק הרלונטים לשאלה, לא כולם): Sug, pID, fData. אני יוצר שאילתה ע"י left join שמכילה את השדות ע"פ
select * from view1 v1 left join view1 v2 on v1.pID=v2.pID where v1.Sug=1 AND v2.Sug=2​
כאשר אני צריך להתמודד עם 10 ערכים שונים בsug. (בעצם, אני מקבץ בשדות שונים את הfData על פי הסוג). האם יש דרך יעילה יותר מאשר לקנן מספר left joins נפרדים? (בטבלה המקורית יש מספר מאות אלפי רשומות, והיא תוצאה של view. אני צריך משהו שלא יהיה ספציפי למסד נתונים אחד - ללקוחות שונים יש דרישות משונות, החל בmdb דרך שרתי ms-sql-express ואורקל ...).
 

s h i m s h o n

New member
תן דוגמא

כדי שנבין. תן דוגמא לשתי הטבלאות - עמודות ונתונים. ותן דוגמא לפלט הרצוי. הסבר: מה הכוונה ב-"לקנן מספר left joins נפרדים" ? בברכה, ש.
 
אנסה להדגים.

נתונה הטבלא:
Sug | pID | fData 1 | 1 | d11 2 | 1 | d21 3 | 1 | d31 1 | 2 | d12 2 | 2 | d22 3 | 2 | d32 1 | 3 | d13 2 | 3 | d23 3 | 3 | d33​
אני מנסה להגדיר שאילתא שתיתן לי את הטבלא הבאה:
pID | Data1 | Data2 | Data 3 1 | d11 | d21 | d31 2 | d12 | d22 | d32 3 | d13 | d23 | d33​
כמות הSug וערכיהם ידועים מראש (כ-10, תלוי במערכת המדויקת), כמות השדות המרבית קטנה מ-128 (כמובן ששדות הdata הם בעצם שדות מרובים, אבל לצורך ההסבר פישטתי). כעת אני מבצע שאילתות בסגנון:
select * from (select * from view1 where sug=1) v1 left join (select * from view1 where sug=2) v2 on v1.pID = v2.pID​
מקיף הכל בסוגריים, נותן שם ומצרף את השדה הבא (אותו משפט select בסיסי, כאשר sug=3). בחלק מהמקרים אני משתמש בשאילתה עם inner-join (דוגמה מצורפת) כך:
select * from (slect * from view1 where Sug=1) v1, (select * from view1 where Sug=2) v2, (select * from view1 where Sug=3) v3 where v1.pID = v2.pID AND v1.pID = v3.pID​
-------------------------------------------------------- אם התכוונת לדוגמה אמיתית ללא ההפשטות, הנה קטע קוד (הקוד הבא עובד מול קובץ mdb, יש לי גרסה שונה - בה נתתי שם שונה לכל שדה כתלות במקורו באשר אני עובד מול ms-sql):
select * from (select CustomerID, Sug, Price, sum(FinalQ3.Consumption) as Consump, sum(FinalQ3.Consumption)*Price as Pay, sum (FinalQ3.NowVal) as NowVal, sum(FinalQ3.YesterdayVal) as YesterdayVal ,sum(FinalQ3.Consumption) as Consumption , fDate from FinalQ3 where Sug=1 group By CustomerID, Sug, Price, fDate) as ePisga, (select CustomerID, Sug, Price, sum(FinalQ3.Consumption) as Consump, sum(FinalQ3.Consumption)*Price as Pay, sum (FinalQ3.NowVal) as NowVal, sum(FinalQ3.YesterdayVal) as YesterdayVal ,sum(FinalQ3.Consumption) as Consumption , fDate from FinalQ3 where Sug=2 group By CustomerID, Sug, Price, fDate) as eGeva, (select CustomerID, Sug, Price, sum(FinalQ3.Consumption) as Consump, sum(FinalQ3.Consumption)*Price as Pay, sum (FinalQ3.NowVal) as NowVal, sum(FinalQ3.YesterdayVal) as YesterdayVal ,sum(FinalQ3.Consumption) as Consumption , fDate from FinalQ3 where Sug=3 group By CustomerID, Sug, Price, fDate) as eShefel, Customer where ePisga.fDate=eGeva.fDate AND ePisga.CustomerID=eGeva.CustomerID AND eShefel.fDate=eGeva.fDate AND eShefel.CustomerID=eGeva.CustomerID AND Customer.ID=eGeva.CustomerID​
 

גרי רשף

New member
נסה כך (עבור SQL Server)

Select Sug, Max(Case When pID=1 Then fData End) Data1, Max(Case When pID=2 Then fData End) Data2, Max(Case When pID=3 Then fData End) Data3, Max(Case When pID=4 Then fData End) Data4, Max(Case When pID=5 Then fData End) Data5, Max(Case When pID=6 Then fData End) Data6, Max(Case When pID=7 Then fData End) Data7, Max(Case When pID=8 Then fData End) Data8, Max(Case When pID=9 Then fData End) Data9, Max(Case When pID=10 Then fData End) Data10 From View1 Group By Sug​
 
בעיה - זה לא עובד על כל הבסיסים

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

גרי רשף

New member
זאת חידה ותשובה לי אין..

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