שאילתת UNION על פני מספר מסדי נתונים

bob on fire

New member
שאילתת UNION על פני מספר מסדי נתונים

שלום,

יש לי בשרת מספר רב של מסדי נתונים, שכולם זהים במבנה שלהם, אך כל אחד מכיל נתונים שונים (באותו מבנה כמובן).

כתבתי שאילתת union כזו:
קוד:
select f1, f2
from db1.dbo.table 1
union
 select f1, f2
from db2.dbo.table 1
union
 select f1, f2
from db3.dbo.table 1

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

יש אפשרות כזו?
 

גרי רשף

New member
הייתי משתמש ב-SQL דינאמי

הכוונה היא שיש לבנות את משפט ה-SQL באופן דינאמי בתוך הקוד בהתאם לתנאים,
ואז להריץ אותו בעזרת Exec או sp_executesql.
מקווה שהרעיון והכיוון ברורים.
&nbsp
האם אתה בטוח שצריך Union ולא Union All?
Union מבצע Distinct על הסט, ולכן הוא יותר כבד ויותר איטי מבחינת הביצועים.
 

bob on fire

New member
סינית


אני לומד SQL באופן עצמאי תו"כ עבודה, אז כל הביטויים שרשמת נשמעים לי סינית. מה שכן, הוספתי אותם לרשימת הנושאים שיש להעמיק בהם, כי נראה שאם לא עכשיו, אז מתישהו בעתיד אני אשתמש בזה.
&nbsp
ואכן, אשתמש בUNION ALL כמובן.
&nbsp
&nbsp
תודה רבה על התשובה שלך.
 

גרי רשף

New member
דוגמה

דוגמה פשוטה שממנה, אני מקווה, תוכל להתקדם הלאה בעצמך.
להלן סקריפט שמקבל פרמטר I@:
אם הוא שווה 1 הוא שולף מ-Table1,
אם הוא שווה 2 הוא שולף מ-Table1 & Table2,
ואם הוא שווה 2 הוא שולף מ-Table1 & Table2 & Table3.
Declare @I Int=1;
Declare @SQL Varchar(Max);
&nbsp
If @I>=1
Set @SQL='Select * From Table1';
&nbsp
If @I>=2
Set @SQL=@SQL+Char(13)+'Union All'+Char(13)+'Select * From Table2';
&nbsp
If @I>=3
Set @SQL=@SQL+Char(13)+'Union All'+Char(13)+'Select * From Table3';
&nbsp
Print @SQL;
--Exec(@SQL);​
הסבר:
המשתנה SQL@ הוא פקודת SQL שנבנית בסקריפט. בסוף הפקודה מודפסת למסך בעזרת Print וכך תוכל לראות איך היא נראית כשהפרמטר I@ הוא 1 או 2 או 3.
(Char(13 מציין מעבר שורה, ונועד לעצב את פקודת ה-SQL כך שתהיה אסתטית.
פקודת ה-Exec מוערת (כלומר - מנוטרלת) כדי שזה לא ירוץ באמת. כשתרצה להריץ, הסר את תווי ההערה (--) בתחילתה.
 

bob on fire

New member
תודה על הדוגמא

אני מעריך שאתעמק בזה בעתיד הקרוב.
&nbsp
נשאלות שתי שאלות,
1. בהקשר לשאלתי הראשונה, בדוגמא שנתת התייחסת לחיבור שלוש טבלאות שונות באותו מסד נתונים.
האם אפשר ליישם את זה לשימוש בטבלאות זהות (מבחינת מבנה) במסדי נתונים שונים?
&nbsp
2. הסקריפטים - היכן נשמרים?
האם בבסיס הנתונים או כקובץ נפרד במחשב המקומי?
מה עושים אם אין לי הרשאה לשמור\ לכתוב סקריפטים במסד עצמו?
 

גרי רשף

New member
תשובות

אם פונים לטבלאות במסדי נתונים אחרים יש לפנות כך:
Select * From MyDB..MyTbl​
&nbsp
הסקריפט במקרה זה נועד להרצה חד פעמית.
במציאות צריך ליצור פרוצדורה שתבצע זאת.
במקום השורה Declare @I Int=1 כתוב Create Procedure MyProc @I Int As.
כמובן שאפשר לתת לה שם אחר במקום MyProc..
הפרוצדורה תישמר ותוכל להפעיל אותה כך (לדוגמה עם הערך 3): Exec MyProc 3
 
למעלה