PDA

View Full Version : نحوه ی فهمیدن ارتباط بین دو جدول؟



saeed_sho
پنج شنبه 06 بهمن 1390, 21:13 عصر
سلام چطوری میشه فهمید که دو تا جدولی که کاربر ایجاد کرده باهم از طریق کلید خارجی ارتباط دارن؟
ممنون میشم راهنمایی کنید

ali_habibi1384
پنج شنبه 06 بهمن 1390, 22:44 عصر
اين بسته به خودت داره ! سوالت خيلي كليه.
براي اين منظور بايد تشخيص بدي كه مثلا كدوم فيلد در كدام جدول مورد استفاده قرار ميگيره.
ارتباطات اين ديتا بيس رو ببين:
http://8208.6.img98.net/out.php/i195104_accounting.jpg

shadi khanum
پنج شنبه 06 بهمن 1390, 23:05 عصر
تو اس کیو ال یا دو تا جدول تو برنامه؟

zarrinnegar
جمعه 07 بهمن 1390, 00:00 صبح
بنده خدا رو چقدر میپیچونید

یه سوال ساده کرده که ارتباط بین 2 جدول رو چطوری میشه فهمید

با این کد اگر رکوردی به شما نشون بده یعنی ارتباط داره بعد میشه فهمید با کدوم 2 تا فیلد و اصلی کدومه و دومی کدومه


Select

object_name(rkeyid)as Table1,

object_name(fkeyid)as Table2,

object_name(constid)as FKey_Name,

c1.name as FKey_Col,

c2.name as Ref_KeyCol

From

sys.sysforeignkeys s

Inner join sys.syscolumns c1

on ( s.fkeyid = c1.id And s.fkey = c1.colid )

Inner join syscolumns c2

on ( s.rkeyid = c2.id And s.rkey = c2.colid )

Where object_name(rkeyid)='Table1'

Order by Table2


بجای Table1 جدول اولت رو بزار و بجای Table2 جدول دومت رو بعد اجراش کن

میتونی sp درست کنی و با پارامتر بهش بدی و هر جفت جدولی رو بهش بدی و خروجیشو بگیری

shadi khanum
جمعه 07 بهمن 1390, 00:10 صبح
دوست عزیز query که شما نوشتی زمانی جواب میده که صرفا دو تا جدول یک رابطه با هم داشته باشن و اگه از یک بیشتر بشه جواب نمیده
موفق باشی

saeed_sho
جمعه 07 بهمن 1390, 10:56 صبح
دوستان از توجه همتون ممنونم zarrinnegar دوست عزیز میشه در مورد کدت یه توضیح مختصر بدی که اون objectname ها و پرانتز جلوش یعنی چی؟ و جدول ها رو اون پایینش اضافه کنم اونجا که نوشته table1 و table2 ؟ و اگه ارتباط نداشتن چی برمی گردونه؟

saeed_sho
جمعه 07 بهمن 1390, 10:59 صبح
دوستان پرسیدن که توی اس کیو ال یا توی برنامه؟ یه فرم هست که لیست جدول ها رو توی یه treeview نشون میده کاربر هر چندتا بخواد انتخاب میکنه و توی لیست باکس انتخاب های کاربر نشون داده میشه میخوام وقتی دکمه ی next رو که کاربر زد برنامه سرچ کنه ببینه جدول های انتخاب شده باهم ارتباط دارن یا نه اگه نه پیغام بده این بگم که از ado.net هم توی برنامه استفاده میکنم جدول ها هم ماله دیتابیسه و توی محیط ویژوال هستش البته میشه از ado.net هم کمک گرفت اما چطوری؟
میشه فهمید از طریق کدام فیلد ارتباط دارن؟

saeed_sho
جمعه 07 بهمن 1390, 11:14 صبح
با این کوئری میشه لیست فیلد های یه جدول رو بدست آورد این به سؤال اول ربطی نداره این یه سؤال دیگه ست
select columns from sysobjects where tablename = 'factor'

shadi khanum
جمعه 07 بهمن 1390, 11:39 صبح
نه دوست عزیز. واسه اینکه لیست ستونهای یک جدول رو داشته باشی باید از این دستور استفاده کنی

select * from sys.columns where object_id = (select object_id from sys.tables where name='Table1')

shadi khanum
جمعه 07 بهمن 1390, 12:32 عصر
دوست عزیز با این کد میتونی ارتباط بین دو تا جدول ذو متوجه بشی که آیا با هم ارتباط دارن یا خیر و اگه دارن چند تا relation دارن و روی چه فیلدهایی از جداوله.به جای TableChild و TableParent اسم جداولت رو بذار
موفق باشی

select object_name(constid) FKey_Name, object_name(fkeyid) Child_Table, c1.name FKey_Col,object_name(rkeyid) Parent_Table, c2.name Ref_KeyCol
from sysforeignkeys s inner join syscolumns c1
on ( s.fkeyid = c1.id and s.fkey = c1.colid )
inner join syscolumns c2 on ( s.rkeyid = c2.id and s.rkey = c2.colid )
where object_name(fkeyid)='TableChild' And object_name(rkeyid)='TableParent'

saeed_sho
جمعه 07 بهمن 1390, 18:09 عصر
shadi khanum دوست عزیز ممنون از توجهتون میشه در مورد کدتون یکم توضیح بدین نمیخوام مثل طوطی فقط کد بزنم در حالی که متوجهش نشدم
ممنونم

zarrinnegar
جمعه 07 بهمن 1390, 18:46 عصر
دوست عزیز با این کد میتونی ارتباط بین دو تا جدول ذو متوجه بشی که آیا با هم ارتباط دارن یا خیر و اگه دارن چند تا relation دارن و روی چه فیلدهایی از جداوله.به جای TableChild و TableParent اسم جداولت رو بذار
موفق باشی

select object_name(constid) FKey_Name, object_name(fkeyid) Child_Table, c1.name FKey_Col,object_name(rkeyid) Parent_Table, c2.name Ref_KeyCol
from sysforeignkeys s inner join syscolumns c1
on ( s.fkeyid = c1.id and s.fkey = c1.colid )
inner join syscolumns c2 on ( s.rkeyid = c2.id and s.rkey = c2.colid )
where object_name(fkeyid)='TableChild' And object_name(rkeyid)='TableParent'



این کدها با کد هایی من نوشتم فرقی نداره جفتشون یک کار انجام میدن


شما وقتی بجای Table1 و Table2 اسم 2 تا جدول خودتون رو بدید یک رکورد نشون میده با چند تا فیلد که عنوان ستونهاش گویا است

هر شیئی که در sql میسازید داخل یک سری table سیستمی مشخصات آنها ذخیره میشوند در جدول sys.sysforeignkeys مشخصات ارتباطات جدول ها ذخیره میشن و چون با کد نمایش داده میشن باید با جدولی که نام Table ها توش ذخیره میشه Join بشه تا اسم جدول ها و اسم ستونها از اون استخراج بشه و در آخر هم بر اساس نام جدول فیلتر میشه و نمایش داده میشه

حالا اگه یک جدول با چند جدول دیگه هم ارتباط داشته باشه باید چند رکورد نشون بده ولی چون بر اساس جدول دومی فیلتر میکنیم فقط یک رکورد رو نشون میده و اگر با جدول مورد نظر ارتباطی نداشته باشه هیچ رکوردی رو نشون نمیده

اگر خواستید جزئیات کار دستتون بیاد هر کدوم از جدول هایی که در این select اومده رو جدا szelect بگیرین متوجه میشید که اطلاعات داخلش چی هست