ورود

View Full Version : حرفه ای: فوری فوتی در مورد connect by prior



oranoos_mt
دوشنبه 17 شهریور 1393, 12:11 عصر
سلام.
آقا کسی میتونه یه توضیحی در مورد connect by prior بگه؟؟
اگه با مثال بگه بهتر
سایتای خارجی رو نگاه کردم ولی دقیقا نمیدونم چیکار میکنه :(
لطفا راهنماییم کنید

ابوالفضل عباسی
دوشنبه 17 شهریور 1393, 15:29 عصر
ادرس سایت های خارجی رو توی translate.google.com بزن بعد بزن translating بعد سایت رو به فارسی ترجمه می کنه
راستی تو چه زمینه ای
connect by prior رو می خواهی؟ در mysql یا oracle یا sql:اشتباه:

oranoos_mt
دوشنبه 17 شهریور 1393, 22:29 عصر
ادرس سایت های خارجی رو توی translate.google.com بزن بعد بزن translating بعد سایت رو به فارسی ترجمه می کنه
راستی تو چه زمینه ای
connect by prior رو می خواهی؟ در mysql یا oracle یا sql
:اشتباه:

متاسفانه ترجمه گوگل به دردم نمیخوره
تو sql , oracle

ابوالفضل عباسی
سه شنبه 18 شهریور 1393, 09:11 صبح
می خواستم کمکی کرده باشم قسمت نبوده انشاالله کارت راه بیوفته

رسول_57
سه شنبه 18 شهریور 1393, 10:01 صبح
با سلام

مفهوم start with و Connect By در Oracle Sql :

عبارت start with .. connect by معمولا برای انتخاب داده ها از ساختار رکوردی سلسله مراتبی استفاده می گردد مانند حالات پدر فرزندی ، رئیس کارمندی و ... . اگر در درس های قدیم با توابع خودفراخوان یا اصطلاحا ریکرسیو (مانند الگوریتم برجهای هانوی که معمولا در درس طراحی الگوریتم های دروس مهندسی کامپیوتر مثال تیپیک است) آشنایی داشته باشید درک این مفهوم ساده تر خواهد بود .

بیاییم یک مثال ساده برای تبیین این مفهوم بزنیم : فرض کنیم جدولی داریم که شامل دو عدد است عدد اول ارش پدر و مادری نامیده می شود و عدد دوم ارزش فرزندی به گونه ایکه ارزش پدر و مادر برابر مجموع ارزش فرزندهایشان است مانند زیر :

set feedback (http://www.adp-gmbh.ch/ora/sqlplus/feedback.html) off

create table (http://www.adp-gmbh.ch/ora/sql/create_table.html) test_connect_by (
parent number,
child number,
constraint uq_tcb unique (http://www.adp-gmbh.ch/ora/misc/integrity_constraints.html#unique) (child)
);

مثلا اگر ارزش پدر و مادری 5 باشد ارزش فرزندان وی می توانند 4 و1 و یا 2و3 باشد و اگر غیر از این شود امکان درج رکورد در این جدول نیست :

5=2+3

insert into test_connect_by values ( 5, 2);
insert into test_connect_by values ( 5, 3);

18 = 11+7
insert into test_connect_by values (18,11);
insert into test_connect_by values (18, 7);


17 = 9+8

insert into test_connect_by values (17, 9);
insert into test_connect_by values (17, 8);

26 = 13+1+12
insert into test_connect_by values (26,13);
insert into test_connect_by values (26, 1);
insert into test_connect_by values (26,12);

15=10+5
insert into test_connect_by values (15,10);
insert into test_connect_by values (15, 5);

38=15+17+6
insert into test_connect_by values (38,15);
insert into test_connect_by values (38,17);
insert into test_connect_by values (38, 6);

18 و 26و 38 پدر و مادری ندارند (یعنی نمی دانیم کی هستند ؟!) ولی احتمالا فرزند دارند که بعدا در جستجویی خواهیم فهمید :

insert into test_connect_by values (null (http://www.adp-gmbh.ch/ora/misc/null.html), 38);
insert into test_connect_by values (null (http://www.adp-gmbh.ch/ora/misc/null.html), 26);
insert into test_connect_by values (null (http://www.adp-gmbh.ch/ora/misc/null.html), 18);



حالا بیاییم جستجویی به صورت زیر انجام دهیم :

select lpad (http://www.adp-gmbh.ch/ora/sql/rpad.html)(' ',2*(level (http://www.adp-gmbh.ch/ora/sql/level.html)-1)) || to_char (http://www.adp-gmbh.ch/ora/sql/to_char.html)(child) s
from test_connect_by
start with parent is null (http://www.adp-gmbh.ch/ora/misc/null.html)
connect by prior child = parent;

معنای این پرس و جو این است که به صورت سلسله مراتبی تمام پدر فرزندها را پیدا کن و از آنهایی که پدر و مادرشان مشخص نیست شروع کن : جواب به صورت زیر خواهد بود :

123241

یعنی ابتدا 38 و 26 و 18 که فیلد پدر و مادرشان نال است را پیدا می کند . بعد به صورت سلسله مراتبی برای 38 گزینه های 15 و 17 و 6 را پیدا می کند و برای 15 گزینه 10 و 5 و برای 17 گزینه 9 و 8 و دوباره برای 5 گزینه 2 و3 و ... . جواب هم به صورت سلسله مراتبی خواهد بود .

امیدوارم توضیحاتم کافی باشد ، اگر سوالی داشتید در خدمتم .