اشتراکها
اشتراکها
SQL Server 2016 و پشتیبانی از JSON
اشتراکها
پشتیبانی از JSON در sql server 2016
At last, SQL Server has caught up with other RDBMSs by providing a useful measure of JSON-support. It is a useful start, even though it is nothing like as comprehensive as the existing XML support. For many applications, what is provided will be sufficient. Robert Sheldon describes what is there and what isn't.
نظرات مطالب
بدست آوردن برگهای یک درخت توسط Recursive CTE
من دقیقا متوجه نشدم نتیجه مورد نظر شما چیست.
آیا نتیجه مورد نظر شما به صورت الحاق یافته (concatenated) هست یا نه؟
در هر صورت باید یکی از دو query زیر نتیجه مورد نظر شما را تولید کند.
موفق باشید
آیا نتیجه مورد نظر شما به صورت الحاق یافته (concatenated) هست یا نه؟
در هر صورت باید یکی از دو query زیر نتیجه مورد نظر شما را تولید کند.
declare @t table (id char(1) primary key, parent char(1)); insert @t values ('A',null), --Level 1 ('B', 'A'), ('C', 'A'), --Level 2 ('D', 'B'), ('E', 'B'),('R','B'), ('F', 'C'), --Level 3 ('G', 'D'), --Level 4 ('H', 'G'), ('I', 'G'); --Level 5 ;with cte as ( select id, rnk=0, concats = cast(id as varchar(10)) from @t where parent is null union all select t.id, rnk+1, cast(cte.concats + t.id as varchar(10)) from cte join @t t on cte.id = t.parent ) select * from cte /* id rnk concats ---- ----------- ---------- A 0 A B 1 AB C 1 AC F 2 ACF D 2 ABD E 2 ABE R 2 ABR G 3 ABDG H 4 ABDGH I 4 ABDGI */ ;with cte as ( select id, rnk=0, concats = cast(id as varchar(10)) from @t where parent is null union all select t.id, rnk+1, cast(cte.concats + t.id as varchar(10)) from cte join @t t on cte.id = t.parent ) select stuff(d.list,1,1,'') as concats from (select ','+concats from cte for xml path(''))d(list) /* concats ---------------------------------------- A,AB,AC,ACF,ABD,ABE,ABR,ABDG,ABDGH,ABDGI */
موفق باشید
امروز در یک تالار سوالی مطرح شد با این عنوان "چگونه میتوانم گرههای برگ یک شاخه را بدست بیاورم". خب راه حلی که فورا به ذهنم رسید استفاده از یک query بازگشتی (recursive) بود.
به ساختار سلسله مراتبی زیر توجه بفرمایید:
و حالا به درخت زیر توجه بفرمایید:
هدف پیدا کردن برگ هایی از شاخه مورد نظر است که در پایینترین سطح قرار گرفته باشند. برای این منظور از همان query بازگشتی استفاده کرده و با کمک تابع dense_ranke گرههای مورد نظر را بدست میاوریم.
به ساختار سلسله مراتبی زیر توجه بفرمایید:
گره هایی که با رنگ سبز علامت گذاری شده اند را گرههای برگ مینامیم چون که آن گرهها بدون زیر شاخه هستند.
فرض کنید از ما خواسته شده است با داشتن گره A تمام برگهای این شاخه را بدست بیاوریم.
دو مرحله را باید طی کنیم ابتدا تمام گره هایی که زیر شاخه گره A هستند را باید بدست آورد سپس توسط یک گزاره گرههای برگ را فیلتر کنیم.
در واقع گره هایی برگ هستند که پدر هیچ گرهی دیگری نباشند.
declare @t table (id char(1) primary key, parent char(1)); insert @t values ('A',null), --Level 1 ('B', 'A'), ('C', 'A'), --Level 2 ('D', 'B'), ('E', 'B'),('R','B'), ('F', 'C'), --Level 3 ('G', 'D'), --Level 4 ('H', 'G'), ('I', 'G'); --Level 5
;with cte as ( select id, rnk=0 from @t where parent = 'A' union all select t.id, rnk+1 from cte join @t t on cte.id = t.parent ) select * from cte where not exists (select * from @t where parent = cte.id);
و حالا به درخت زیر توجه بفرمایید:
هدف پیدا کردن برگ هایی از شاخه مورد نظر است که در پایینترین سطح قرار گرفته باشند. برای این منظور از همان query بازگشتی استفاده کرده و با کمک تابع dense_ranke گرههای مورد نظر را بدست میاوریم.
;with cte as ( select id, rnk=0 from @t where parent = 'A' union all select t.id, rnk+1 from cte join @t t on cte.id = t.parent ) select * from ( select *, dense_rank() over(order by rnk desc) rk from cte )t where rk = 1
گاهی اوقات لازم میباشد، در زمان Sort نمودن یک ستون، تمایل داشته باشیم Range خاصی از مقادیر آن ستون در ابتدا قرار گیرد، و عملیات Sort پس از آن Range، اعمال گردد. برای انجام چنین کاری میتوانیداز روش زیر استفاده نمایید:
برای درک مطلب مثالی میزنیم:
در ابتدا Script زیر را اجرا نمایید، که شامل یک جدول و درج چند رکورد در آن میباشد:
Create Table TestSort (ID int identity(1,1), Name nvarchar(30), Color nvarchar(15) )
درج رکورد:
Insert into TestSort (Name,color) Values ('Adjustable Race',null) ,('Bearing Ball',null) ,('Headset Ball Bearings',null) ,('LL Crankarm','Black') ,('ML Crankarm','Black') ,('Chainring','Black') ,('Front Derailleur Cage','Silver') ,('Front Derailleur Linkage','Silver') ,('Lock Ring','Silver') ,('HL Road Frame - Red, 62','Red') ,('HL Road Frame - Red, 48','Red') ,('LL Road Frame - Red, 44','Red') ,('Full-Finger Gloves, M','RED') ,('Road-550-W Yellow, 38','Yellow') ,('Road-550-W Yellow, 40','Yellow') ,('Road-550-W Yellow, 42','Yellow') ,('Classic Vest, S','Blue') ,('Classic Vest, M','Blue') ,('Classic Vest, L','Blue')
در جدول TestSort ستونی به نام Color داریم، که نام رنگها در آن درج شده است، رنگهایی همچون Black ، Silver،Blue،Yellow و Red
درابتدا روی ستون Color بصورت نرمال Sort صعودی انجام میدهیم:
Select t.ID,t.Name,t.Color from TestSort as t order by t.Color
خروجی:
مطابق شکل،زمانی که Sort بصورت صعودی است، رکوردهایی را که ستون Color آنها دارای مقدار Null میباشند، در ابتدای جدول قرار گرفته اند.
در ادامه میخواهیم، عملیات Sort ی را روی ستون Color انجام دهیم، بطوریکه تمامی رکوردهایی که مقدار ستون Color شان Red است، در ابتدای جدول قرار گیرد، و پس از آن عملیات سورت روی رنگهای دیگر اعمال شود.
برای انجام چنین کاری کافیست Script زیر را اجرا نمایید:
Select t.ID,t.Name,t.Color from TestSort as t Where t.color is not null order by Case t.Color When 'Red' Then Null Else t.color End;
خروجی:
چطور اینکار انجام شد:
اگر بهScript ذکر شده دقت نمایید، در قسمت Order by اشاره کردیم، تمام مقادیر Red در ستون Color به Null تغییر کنند، بنابراین SQL Server، در ابتدا مقادیر Red را یافته آنها را به Null تغییر و سپس عملیات سورت را انجام میدهد،
برای درک بیشتر عملیاتی را که SQL Server پشت صحنه انجام میدهد با Script زیر قابل شبیه سازی میباشد:
Select * into Simulation from (Select t.ID,t.Name,t.Color, Case t.Color When 'Red' Then Null Else t.color End RedNull from TestSort as t Where t.color is not null) A
سپس روی ستون RedNull از جدول Simulation سورت انجام میدهیم:
Select * from Simulation order by Rednull
خروجی:
مطابق شکل،پشت صحنه SQL Server چنین کاری را انجام میدهد، و در زمان نمایش ستون RedNull پنهان یا حذف میگردد، و ستون Color، Name و ID نمایش داده میشود.
امیدوارم مفید واقع شده باشد.
اشتراکها
SQL Server 2016 معرفی شد
اشتراکها