PDA

View Full Version : ارتباط بین جداول



M.YasPro
چهارشنبه 01 اردیبهشت 1389, 12:23 عصر
سلام
عکس زیر رو ببینید .
توی جدول manager_io می خوام به جدول securityman دو بار relation بزنم
چون از یه کلید دو بار توی یه جدول استفاده شده .
ایا این کار امکان پذیره ؟

از من ارور می گیره


مممنون از توجهتون

محمد سلیم آبادی
چهارشنبه 01 اردیبهشت 1389, 14:47 عصر
سلام،
این کار امکان پذیره. و اتفاقا کار رایجی هم هست. بطور مثال در جدول سفر ها ما دو کلید خارجی داریم با نام های شهر مبدا و شهر مقصد که هر دو به یک جدول به نام شهر ها متصل شده اند.

می تونید بگید دقیقا چه پیغام خطایی داده می شود؟

M.YasPro
چهارشنبه 01 اردیبهشت 1389, 15:37 عصر
ممنون از جوابتون


'managers' table saved successfully
'security_mans' table saved successfully
'manager_IO' table
- Unable to create relationship 'FK_manager_IO_managers'.
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_manager_IO_managers". The conflict occurred in database "db", table "dbo.managers", column 'manager_id'.

محمد سلیم آبادی
چهارشنبه 01 اردیبهشت 1389, 15:47 عصر
بررسی کنید ببینید آیا در جدول manager_IO در ستون manager_ID مقادیری درج شده است که خارج از مقادیر موجود در جدول managers باشد یا نه؟ یا بهتره این کوئری زیر را اجرا کنید و به من بگید آیا سطری برگردانده می شود یا خیر.


SELECT *--d
FROM manager_IO
WHERE manager_id NOT INT(SELECT manager_id FROM managers)--d

M.YasPro
پنج شنبه 02 اردیبهشت 1389, 11:54 صبح
از پیگیری تون بی نهایت سپاسگزارم
مشکل همونی بود که شما گفتین
جدول manager_IO من مقادیری توش وارد شده بود که توی managers وجود نداشت .

محمد سلیم آبادی
پنج شنبه 02 اردیبهشت 1389, 12:51 عصر
از پیگیری تون بی نهایت سپاسگزارم
مشکل همونی بود که شما گفتین
جدول manager_IO من مقادیری توش وارد شده بود که توی managers وجود نداشت .

کلید خارجی یا foreign key constraint یک نوع قید هست. قید زمانی می تونه روی جدول تعریف بشه که داده هایی که قبلا در جدول درج شدند قید را نقض نکنند. این برای تمام قید ها مصداق دارد.

M.YasPro
سه شنبه 07 اردیبهشت 1389, 10:48 صبح
اگر میشه یه select از جدول managerIO بزارید که تمام رکورد های این جدول و جدول های وابستشو با احتساب رابطه ها استخراج کنه .
من روی ارتباط securityMan با manager io گیرم چون نمیتونم دو بار توی کوئری ازش استفاده کنم .
ممنون از توجهتون

محمد سلیم آبادی
سه شنبه 07 اردیبهشت 1389, 12:00 عصر
SELECT *
FROM manager_IO M
INNER JOIN security_mans S1
ON M.issecman_id =S1.secman_id
INNER JOIN security_mans S2
ON M.osecman_id = S2.secman_id
INNER JOIN managers M1
ON M.manager_id = M1.manager_id;

M.YasPro
سه شنبه 07 اردیبهشت 1389, 12:17 عصر
ممنون از جوابتون
میشه یه توضیح مختصر هم بدین ؟

محمد سلیم آبادی
سه شنبه 07 اردیبهشت 1389, 12:24 عصر
ممنون از جوابتون
میشه یه توضیح مختصر هم بدین ؟

شما در جدول manager_io سه ستون خارجی دارین که به دو جدول ارجاع داده شده اند.
ما به تعداد ستون خارجی که در جدول داریم نیاز داریم که اتصال ایجاد کنیم. حالا فرقی نمی کند که هر سه ستون به یک جدول ارجاع داده شده باشند یا نه.
در این مورد شما، دو ستون به یک جدول یکسان ارجاع داده شده اند که بایستی دو بار JOIN صورت بگیرد.
توجه به این نکته ضروری است که به جداول یکسانی که در Query استفاده می کنید نام های مستعار متفاوت بدهین تا اختلال بوجود نیاید.

M.YasPro
سه شنبه 14 اردیبهشت 1389, 12:41 عصر
حالا اگه توی جدول manager_IO یکی از اون فیلدها(isecman_id یا osecman_id) ، نال باشه چیکار باید کرد ؟
NULL بودن یکی از فیلد های بالا تعدادی از سطر ها رو از خروجی حذف می کنه که
خروجی حاصل ، خروجی مطلوب نیست در این صورت.

محمد سلیم آبادی
سه شنبه 14 اردیبهشت 1389, 13:00 عصر
این را امتحان کنید:


SELECT *
FROM manager_IO M
LEFT OUTER JOIN security_mans S1
ON (M.issecman_id = S1.secman_id OR (M.issecman_id IS NULL AND S1.secman_id IS NULL))
LEFT OUTER JOIN security_mans S2
ON (M.osecman_id = S2.secman_id OR (M.osecman_id IS NULL AND S2.secman_id IS NULL))
LEFT OUTER JOIN managers M1
ON M.manager_id = M1.manager_id;

M.YasPro
سه شنبه 14 اردیبهشت 1389, 14:15 عصر
اگه می خواید ماهیگیری هم یادم بدید یه توضیح کوچولو هم لطف کنید .

محمد سلیم آبادی
سه شنبه 14 اردیبهشت 1389, 14:33 عصر
ظاهرا شما کلید های خارجی در جدول Manager_IO را Nullable گرفتین. و چون مقدار Null با هیچ مقداری match نمیشه سطری هم بر گردانده نمی شود. حالا برای اینکه کاری کنیم این سطرها هم به نتیجه اضافه شوند از Outer Join استفاده کردم.

البته در شرط اتصال به نظر می رسه نیازی به قسمت دوم شرط (بعد از OR) نباشه.

M.YasPro
سه شنبه 14 اردیبهشت 1389, 15:16 عصر
ممنون از جوابتون
outer join کارش چیه ؟

محمد سلیم آبادی
سه شنبه 14 اردیبهشت 1389, 15:22 عصر
ممنون از جوابتون
outer join کارش چیه ؟

در پست قبلیم به کربردش اشاره کردم. ولی این سایت و مخصوصا این صفحه را برای پرسش شما مفید یافتم:
http://www.w3schools.com/sql/sql_join_left.asp