PDA

View Full Version : نحوه select گرفتن از گروهبندی با تعداد بی نهایت



az.heidarzadeh
یک شنبه 08 آبان 1390, 18:10 عصر
سلام
من یک جدول برای گروه های کالاهام دارم که میتونه n تا زیرشاخه داشته باشه اینطوری

77243

بعد توی جدول کالاهام گروه هر کالا رو انتخاب میکنم اینطوری

77241

بعد یه view میسازم که هم کد هر گروه کالا رو داشته باشم هم کد parent اون کالا رو اینطوری

77242

حالا یه درخت ایجاد کردم از گروه هام اینطوری

77244

اما مشکل اینجاست که توی زیر شاخا های پایین تر ParentID رو از دست میدم و دیگه نمیتونم کالاهامو select کنم
مثل شکل که من دوتا کالا توی ماوس دارم که زیر مجموعه کامپیوترن. 1 کالا توی lcd دارم که زیر مجموعه مانیتور و باز زیر مجموعه کامپیوتره و یکی هم توی led که اونم همینطوره
الان وقتی روی مانیتور کلیک میکنم 2 تا کالا بهم میده چون parentID شون یکیه اما وقتی روی کامپوتر کلیک میکنم فقط 2 تا ماوس و میده و دیگه مانیتور ها رو نمیده که این وضعیت هر چقدر فرزندام بیشتر بشه ادامه داره
اگه بخوام بدونم چندتا کالای کامپیوتر دارم چی؟
یا شاید کلا تحلیلم مشکل داره آره؟
ممنون میشم اگه لطفا راهنماییم کنید... :لبخندساده:

یوسف زالی
یک شنبه 08 آبان 1390, 21:39 عصر
سلام دوست من.
برای دسترسی به تمام زیرمجموعه های یک درخت باید از حلقه استفاده کنید:
declare @tbl as table(SN int) -- temp table
insert into @tbl values(START_SN) -- seriale grouhe asli

while @@rowcount > 0
insert into @tbl
select ID
from GroupTBL
where FatherID in (select * from @tbl) and not ID in (select * from @tbl) -- inserte hameye zir shakhe ha

select * from @tbl join TBL on ... -- kala ha

Reza_Yarahmadi
یک شنبه 08 آبان 1390, 23:16 عصر
در صورت استفاده از SQL Server 2005 به بالا میتونید از روش زیر هم استفاده کنید
Create Table #ObjectLevel (
dcID int null,
dcParentID int null,
vcName nvarchar(50) null)

Create Table #Objects (
dcID int null,
dcGroupID int null,
vcModel nvarchar(50) null)

Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (1, 0, N'کامپیوتر')
Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (2, 1, N'کیبورد')
Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (3, 1, N'ماوس')
Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (4, 1, N'مانیتور')
Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (5, 4, N'LCD')
Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (6, 4, N'LED')

Insert Into #Objects (dcID, dcGroupID, vcModel) Values (1, 3, N'Genius')
Insert Into #Objects (dcID, dcGroupID, vcModel) Values (2, 3, N'Farassoo')
Insert Into #Objects (dcID, dcGroupID, vcModel) Values (3, 5, N'Samsung 1955')
Insert Into #Objects (dcID, dcGroupID, vcModel) Values (4, 6, N'Samsung 1965')

Select
O.dcID,
O.dcGroupID,
OL.vcName,
O.vcModel
From
#Objects O INNER JOIN #ObjectLevel OL
ON
O.dcGroupID = OL.dcID


Declare @LevelID int
Set @LevelID = 1 -- Computer Level


;With ChildIDWithSource (ID) as
(
Select @LevelID as ID
UNION ALL
Select O.dcID as ID
From
#ObjectLevel O INNER JOIN ChildIDWithSource CIWS
ON
O.dcParentID = CIWS.ID
)

Select *
From #Objects
Where dcGroupID IN (Select ID from ChildIDWithSource)


Drop Table #ObjectLevel
Drop Table #Objects
(از دستور With تا قبل از Drop کد مورد نظر شماست)

az.heidarzadeh
دوشنبه 09 آبان 1390, 15:03 عصر
سلام دوست من.
برای دسترسی به تمام زیرمجموعه های یک درخت باید از حلقه استفاده کنید:
declare @tbl as table(SN int) -- temp table
insert into @tbl values(START_SN) -- seriale grouhe asli

while @@rowcount > 0
insert into @tbl
select ID
from GroupTBL
where FatherID in (select * from @tbl) and not ID in (select * from @tbl) -- inserte hameye zir shakhe ha

select * from @tbl join TBL on ... -- kala ha
سلام
ممنون بابت پاسختون اما اصلا ازش هیچی نفهمیدم، من واقعا sql خیلی خوب بلد نیستم، اگه لطف کنید و کد و کامل بزارید تا اجرا بشه ممنون میشم...

یوسف زالی
دوشنبه 09 آبان 1390, 15:15 عصر
دوست من اول سریال جایی که مد نظرتونه رو در جدول موقت می ریزیم.
بعد تا وقتی که اون شاخه دارای زیر شاخه ای هست در جدول می ریزیم.
آخر سر اونو با کالاهاش الحاق می کنیم.

declare @tbl as table(SN int) -- temp table
insert into @tbl values(START_SN) -- seriale grouhe asli

while @@rowcount > 0
insert into @tbl
select dcID
from GroupTBL
where dcParentID in (select * from @tbl) and not dcID in (select * from @tbl) -- inserte hameye zir shakhe ha

select * from @tbl join TBL on ... -- kala ha

اسم جدول هاتونو جایگذاری کنید.

az.heidarzadeh
دوشنبه 09 آبان 1390, 15:41 عصر
در صورت استفاده از SQL Server 2005 به بالا میتونید از روش زیر هم استفاده کنید
[SQL]
واو، خیلی خیلی ممنون :لبخندساده:
کد کاملا درست بود و من تونستم ازش استفاده کنم...

Felony
یک شنبه 15 آبان 1390, 10:57 صبح
اگر این پیاده سازی رو در یک جدول انجام داده باشید میشه اینطور نوشت :
SELECT
sr1.ID
,sr1.Title
,sr2.ParentID
,sr2.Title
FROM SelfRelation as sr1 INNER JOIN SelfRelation as sr2 ON sr1.ID = sr2.ParentID

یوسف زالی
یک شنبه 15 آبان 1390, 12:04 عصر
مجتبی جان برای سطح دوم به بعد جواب نمی ده.

Felony
یک شنبه 15 آبان 1390, 12:53 عصر
مجتبی جان برای سطح دوم به بعد جواب نمی ده.
حواسم به این نبود که میخواد درخت تشکیل بده ؛ البته میشه همون Query رو توسعه داد برای سطح های بعدی ولی به دردسرش نمیارزه .

tarsim
شنبه 04 آذر 1396, 18:09 عصر
در صورت استفاده از SQL Server 2005 به بالا میتونید از روش زیر هم استفاده کنید
Create Table #ObjectLevel (
dcID int null,
dcParentID int null,
vcName nvarchar(50) null)

Create Table #Objects (
dcID int null,
dcGroupID int null,
vcModel nvarchar(50) null)

Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (1, 0, N'کامپیوتر')
Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (2, 1, N'کیبورد')
Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (3, 1, N'ماوس')
Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (4, 1, N'مانیتور')
Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (5, 4, N'LCD')
Insert Into #ObjectLevel (dcID, dcParentID, vcName) Values (6, 4, N'LED')

Insert Into #Objects (dcID, dcGroupID, vcModel) Values (1, 3, N'Genius')
Insert Into #Objects (dcID, dcGroupID, vcModel) Values (2, 3, N'Farassoo')
Insert Into #Objects (dcID, dcGroupID, vcModel) Values (3, 5, N'Samsung 1955')
Insert Into #Objects (dcID, dcGroupID, vcModel) Values (4, 6, N'Samsung 1965')

Select
O.dcID,
O.dcGroupID,
OL.vcName,
O.vcModel
From
#Objects O INNER JOIN #ObjectLevel OL
ON
O.dcGroupID = OL.dcID


Declare @LevelID int
Set @LevelID = 1 -- Computer Level


;With ChildIDWithSource (ID) as
(
Select @LevelID as ID
UNION ALL
Select O.dcID as ID
From
#ObjectLevel O INNER JOIN ChildIDWithSource CIWS
ON
O.dcParentID = CIWS.ID
)

Select *
From #Objects
Where dcGroupID IN (Select ID from ChildIDWithSource)


Drop Table #ObjectLevel
Drop Table #Objects
(از دستور With تا قبل از Drop کد مورد نظر شماست)

سللام من این کد رو تبدیل یک پروسجر کردم حالا توی سی شارپ میتونم مقدار بازگشتی رو روی گرید ویو نمایش بدم . لطفا بگید چطوری میتونم به صورت صحیح روی یک treeView به صورتی درختی و نکته مهم اینکه هر دسته n تا زیر مجموعه داره و هر زیر مجموعه باز n تا زیر مجموعه داره و باز زیر مجموعه های اونها هم n تا زیر مجموعه داره یکنی بعضی کالا ها کاملا به صورت افقی به جلو اضافه میشه . کد فراخوانی رو قرار میدم لطفا راهنمایی کنید


SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=test;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
SqlDataAdapter da = new SqlDataAdapter(cmd);
cmd.CommandType = CommandType.StoredProcedure;
DataTable dt = new DataTable();

con.Open();
cmd.CommandText = "pros";
da.Fill(dt);
con.Close();
dataGridView1.DataSource = dt;