CLASS Department ‘Отдел’;
name ‘Наименование’ = DATA STRING[100] (Department);
CLASS Employee ‘Сотрудник’;
department ‘Отдел’ = DATA Department (Employee);
salary ‘Зарплата’ = DATA NUMERIC[10,2] (Employee);
countEmployees ‘Кол-во сотрудников’ (Department d) =
GROUP SUM 1 IF department(Employee e) = d;
salarySum ‘Суммарная зарплата’ (Department d) =
GROUP SUM salary(Employee e) IF department(e) = d;
په هر DBMS کې د دې پوښتنې پلي کولو پیچلتیا به ورته وي او (د کارمندانو شمیر)ځکه چې دا محاسبه د کارمندانو ټول جدول سکین کولو او بیا د ډیپارټمنټ لخوا ګروپ کولو ته اړتیا لري. دلته به ځینې کوچني وي (موږ باور لرو چې د ډیپارټمنټونو په پرتله ډیر کارمندان شتون لري) د غوره شوي پلان پورې اړه لري O (د کارمندانو شمیره) او یا او (د څانګو شمیر) د ګروپ کولو او داسې نورو لپاره.
دا روښانه ده چې د اعدام سر سر په مختلفو DBMSs کې توپیر لري، مګر پیچلتیا به په هیڅ ډول بدلون ونلري.
په وړاندیز شوي تطبیق کې، فعال DBMS به یوه فرعي پوښتنه رامینځته کړي چې د ډیپارټمنټ لپاره اړین ارزښتونه به محاسبه کړي، او بیا به د نوم ترلاسه کولو لپاره د ډیپارټمنټ میز سره یوځای شي. په هرصورت، د هر فعالیت لپاره، کله چې اعلان کول، دا ممکنه ده چې یو ځانګړی مادی شوی مارکر تنظیم کړئ. سیسټم به په اوتومات ډول د هر ورته فعالیت لپاره ورته ساحه رامینځته کړي. کله چې د فنکشن ارزښت بدل شي، د ساحې ارزښت به په ورته لیږد کې هم بدلون ومومي. کله چې دې فنکشن ته لاسرسی ومومئ، مخکې حساب شوي ساحې ته به لاسرسی ومومي.
په ځانګړې توګه، که تاسو د دندو لپاره مواد جوړ کړئ د کارمندانو شمیر и معاش، بیا به د څانګو لیست سره په میز کې دوه ساحې اضافه شي ، کوم چې به د کارمندانو شمیر او د دوی ټول معاش ذخیره کړي. هرکله چې د کارمندانو، د دوی په معاشونو یا د څانګې په تړاو کې بدلون راشي، سیسټم به په اتوماتيک ډول د دې برخو ارزښت بدل کړي. پورته پوښتنه به دې ساحو ته مستقیم لاسرسی ومومي او په کې به اجرا شي او (د څانګو شمیر).
بندیزونه څه دي؟ یوازې یو شی: دا ډول فنکشن باید د ان پټ ارزښتونو محدود شمیر ولري د کوم لپاره چې ارزښت یې تعریف شوی. که نه نو، دا به ناشونې وي چې یو میز جوړ کړئ چې ټول ارزښتونه یې ذخیره کړي، ځکه چې د لامحدود قطارونو سره میز شتون نلري.
بېلګه:
employeesCount ‘Количество сотрудников с зарплатой > N’ (Department d, NUMERIC[10,2] N) =
GROUP SUM salary(Employee e) IF department(e) = d AND salary(e) > N;
دا فنکشن د N لامحدود ارزښتونو لپاره تعریف شوی (د مثال په توګه، کوم منفي ارزښت مناسب دی). له همدې امله، تاسو نشئ کولی په دې باندې مواد واچوئ. نو دا یو منطقي محدودیت دی، نه تخنیکي (دا ځکه چې موږ نشو کولی دا پلي کړو). که نه نو، هیڅ محدودیتونه شتون نلري. تاسو کولی شئ ګروپونه وکاروئ، ترتیب کړئ، او او یا، PARTITION، تکرار، او داسې نور.
د مثال په توګه، د تیرې مقالې په 2.2 ستونزه کې، تاسو کولی شئ په دواړو دندو کې مواد واچوئ:
bought 'Купил' (Customer c, Product p, INTEGER y) =
GROUP SUM sum(Detail d) IF
customer(order(d)) = c AND
product(d) = p AND
extractYear(date(order(d))) = y MATERIALIZED;
rating 'Рейтинг' (Customer c, Product p, INTEGER y) =
PARTITION SUM 1 ORDER DESC bought(c, p, y), p BY c, y MATERIALIZED;
SELECT contactName(Customer c), name(Product p) WHERE rating(c, p, 1997) < 3;
سیسټم به پخپله د ډول کیلي سره یو میز رامینځته کړي پيرودونکو, د محصول د и نغښتی، به دې ته دوه ساحې اضافه کړي او د هر ډول بدلون سره به د ساحې ارزښتونه تازه کړي. کله چې دې دندو ته نور زنګونه جوړ شي، دوی به حساب نه شي، بلکې ارزښتونه به د اړوندو ساحو څخه لوستل شي.
level (Group child, Group parent) = RECURSION 1l IF child IS Group AND parent == child
STEP 2l IF parent == parent($parent);
isParent (Group child, Group parent) = TRUE IF level(child, parent) MATERIALIZED;
ځکه چې د فعالیت لپاره پلار دی د موادو په نښه شوی، نو بیا به د دې لپاره دوه کیلي (ډلې) سره یو میز جوړ شي، په کوم کې چې ساحه پلار دی یوازې به ریښتیا وي که لومړۍ کیلي د دوهم ماشوم وي. په دې جدول کې د ننوتلو شمیر به د ګروپونو شمیر سره مساوي وي چې د ونې منځنۍ ژورې سره ضرب شوي. که تاسو اړتیا لرئ، د بیلګې په توګه، د یوې ځانګړې ډلې د اولادونو شمیره، تاسو کولی شئ دا فعالیت وکاروئ:
childrenCount (Group g) = GROUP SUM 1 IF isParent(Group child, g);
د SQL په پوښتنه کې به CTE نه وي. پرځای به یو ساده ګروپ BY وي.
د دې میکانیزم په کارولو سره، تاسو کولی شئ په اسانۍ سره ډیټابیس غیر معمولي کړئ که اړتیا وي:
CLASS Order 'Заказ';
date 'Дата' = DATA DATE (Order);
CLASS OrderDetail 'Строка заказа';
order 'Заказ' = DATA Order (OrderDetail);
date 'Дата' (OrderDetail d) = date(order(d)) MATERIALIZED INDEXED;
لومړی، تاسو کولی شئ یوازې مادي کول فعال کړئ که تاسو دمخه منظم لید جوړ کړی وي. که نه نو، تاسو به د دې مادي کولو کارولو لپاره نوي جوړ شوي لید ته د لاسرسي لپاره پاتې غوښتنې بیا ولیکئ. یا هرڅه لکه څنګه چې وي پریږدئ، مګر دا به لږترلږه غیر اغیزمن وي که چیرې مخکې له مخکې محاسبه شوي معلومات شتون ولري، مګر ډیری پوښتنې تل دا نه کاروي، مګر بیا یې حسابوي.
د SELECT لیست باید د ګروپ کولو توپیر ولري چې کیدای شي یو وي GROUPING_ID په ټولو کې فعالیت GROUPBY څرګندونې یا GROUPING د هر یو لپاره فعالیت کوي GROUPBY بیان د مثال په توګه، که د GROUPBY د مادي لیدلوري فقره دا ده "GROUPBYCUBE(a, b)"، بیا د SELECT لیست باید ولري "GROUPING_ID(a, b)یا "GROUPING(a)ANDGROUPING(b)» د دې لپاره چې مادي لید د چټک تازه کولو وړ وي.
GROUPBY باید د دوه اړخیز ګروپونو پایله ونلري. د مثال په ډول، "GROUP BY a, ROLLUP(a, b)"په چټکۍ سره د تازه کولو وړ نه دی ځکه چې دا د دوه اړخیز ګروپونو پایله ده"(a), (a, b), AND (a)".
If GROUP BY شتون لري، د VIEW تعریف باید ولري COUNT_BIG(*) او باید پکې نه وي HAVING. دا GROUP BY محدودیتونه یوازې د شاخص شوي لید تعریف لپاره پلي کیږي. یوه پوښتنه کولی شي په خپل اجرایوي پلان کې د شاخص شوي لید څخه کار واخلي حتی که دا نه پوره کوي GROUP BY محدودیتونه.
که د لید تعریف ولري a GROUP BY فقره، د ځانګړي کلستر شوي شاخص کلید یوازې هغه کالمونو ته حواله کولی شي چې په کې مشخص شوي GROUP BY شق.
دا دلته روښانه ده چې هنديان ښکیل نه وو، ځکه چې دوی پریکړه وکړه چې دا د سکیم مطابق ترسره کړي "موږ به لږ څه وکړو، مګر ښه." دا، دوی په ساحه کې ډیر ماینونه لري، مګر د دوی موقعیت ډیر شفاف دی. ترټولو نا امیده شی دا محدودیت دی:
لید باید یوازې د بیس میزونو ته اشاره وکړي چې د لید په څیر ورته ډیټابیس کې دي. لید نشي کولی نورو نظرونو ته اشاره وکړي.
زموږ په اصطلاح کې، دا پدې مانا ده چې یو فنکشن نشي کولی بل مادي فعالیت ته لاسرسی ومومي. دا ټول ایډیالوژی په جواني کې له مینځه وړي.
همدارنګه، دا محدودیت (او نور په متن کې) د کارولو قضیې خورا کموي:
د لید تعریف کې د SELECT بیان باید لاندې Transact-SQL عناصر ونه لري:
COUNT
د ROWSET دندې (OPENDATASOURCE, OPENQUERY, OPENROWSET، او OPENXML) OUTER یوځای کیږي (LEFT, RIGHT، او یا FULL)
اخستل شوی جدول (د مشخص کولو په واسطه تعریف شوی SELECT بیان په FROM فقره)
ځان سره یوځای کوي
په کارولو سره د کالمونو مشخص کول SELECT * or SELECT <table_name>.*
DISTINCT STDEV, STDEVP, VAR, VARP، او یا AVG
د ګډ جدول بیان (CTE)
ثاب1, متن, متن, انځور, ایکس ایم ایل، او یا د فایل جریان کالمونه
پوښتنه OVER فقره، کوم چې درجه بندي یا مجموعي کړکۍ دندې شاملې دي
د بشپړ متن وړاندوینه (CONTAINS, FREETEXT) SUM هغه فنکشن چې د نه منلو وړ بیان ته اشاره کوي ORDER BY
د CLR کارونکي لخوا ټاکل شوي مجموعي فعالیت TOP CUBE, ROLLUP، او یا GROUPING SETS متصدیانو
MIN, MAX UNION, EXCEPT، او یا INTERSECT متصدیانو TABLESAMPLE
جدول متغیرات OUTER APPLY or CROSS APPLY PIVOT, UNPIVOT