PDA

View Full Version : self join , inner join



Maryam mohseni
چهارشنبه 14 اسفند 1392, 13:30 عصر
سلام
من الان دو روزه اسیر یه اسکریپ شدم که در اولین نگاه فکر می کردم کلا یه دقیقه برای نوشتنش زمان لازم دارم!!!
ممنون میشم کمکم کنید.

من یک جدول به نام tmenu با رکوردهای زیر دارم:
http://www.8pic.ir/images/73020848888171752725.jpg

و یک جدول با نام tuseraccess با رکوردهای زیر:
http://www.8pic.ir/images/91056682377397103399.jpg


در جدول tmenu منوها مشخص شدند که فیلد parentid به menuid به صورت self join عمل می کنه و منوهای اصلی با parentid=0 مشخص می شوند.
در واقع حالت پدر- فرزند دارند و از روی این جدول میشه منوی برنامه رو ساخت.

جدول tuseraccess مشخص می کنه هر کاربر به چه زیر منوهایی دسترسی داره.
حالا برای ساخت منو من نیاز دارم چنین ساختاری رو با نوشتن اسریپت به دست بیارم. به عنوان مثال برای کاربر کد 120 داشته باشم:



کد کاربر ID عنوان منو کدparent

120 -- 5 -- نوع پزشک -- 1
120 -- 6 -- نوع محل درمان -- 1
120 -- 8 -- ثبت شماره دفترچه -- 2
120 -- 1 -- اطلاعات پایه -- 0
120 -- 2 -- عملیات -- 0


یعنی منوهایی که کاربر 120 به اونها دسترسی داره و parent اون منوها رو به صورت رکورد زیر هم نشون بده

امیدوارم درست توضیح داده باشم.من این اسکریپت رو با self join , inner join در حالت های مختلف نوشتم ولی به جواب نرسیدم.
برای نمونه همچین اسکریپتی که متاسفانه به جواب نرسید!


SELECT t3.fuserid,t1.FMenuID, t1.FMenuCaption, t1.FparentID, t1.FPath
FROM TMENU AS t1
INNER JOIN dbo.tuseraccess AS t3 ON t1.FMenuID = t3.FMenuID
where t3.fuserid=120
UNION
SELECT g.fMenuID, g.FMenuCaption, g.FparentID,g.FPath
FROM TMENU as g
where g.fMenuID in(
SELECT t1.FparentID
FROM TMENU AS t1
INNER JOIN TMENU AS t2 ON t2.FMenuID = t1.FparentID)

espootin
پنج شنبه 15 اسفند 1392, 00:04 صبح
با سلام.

با فرض اینکه شما فقط تا یک سطح پایین می روید، میشه از این کوری نسبتا ساده استفاده کرد و به جواب رسید:

SELECT u.`fuserid`, u.`fmenuid`, m.`fmenucaption`, m.`fparentid`
FROM tuseraccess AS u
INNER JOIN tmenu AS m
ON u.`fmenuid` = m.`fmenuid` AND u.`fuserid` = 120
UNION
SELECT n.fuserid, t.fmenuid, t.fmenucaption, t.fparentid
FROM tmenu AS t
INNER JOIN (
SELECT u.`fuserid`,m.`fparentid`
FROM tuseraccess AS u
INNER JOIN tmenu AS m
ON u.`fmenuid` = m.`fmenuid` AND u.`fuserid` = 120 ) AS n
ON t.fmenuid = n.fparentid





در غیر اینصورت :
- در صورتی که تا ۳ یا ۴ سطح پایین تر بخواهید بدست بیاورید باز می توانید از روش های نظیر روش فوق استفاده کنید.
- در صورتی که تا n سطح پایین تر بخواهید بدست بیاورید ، باید از روش recursive استفاده کنید.

afshin9032
پنج شنبه 15 اسفند 1392, 22:24 عصر
در صورتی که می خواهی از چند سطح استفاده کنی ، میتونی از temporary table هم استفاده کنی که سطرها رو توی این جدول temp ذخیره کنی و بعد با یک select معمولی بخونی .
البته این روش رو بهتره توی routine تعریف کنید .