PDA

View Full Version : اگر دو جدول با هم رابطه چند به چند داشته باشند ،و بخواهیم اطلاعات یکی را به وسیله اطلاعات دیگری upda



nAVA470
پنج شنبه 18 فروردین 1390, 10:27 صبح
اگر دو جدول با هم رابطه چند به چند داشته باشند ،و بخواهیم اطلاعات یکی را به وسیله اطلاعات دیگری update کنیم. برایمون فرقی هم نمیکند که کدام اول باشد .
به طور مثال یک استاد میتواند چندین درس ارائه دهد و همچنین یک استاد میتواند روزهای مختلفی آمادگی خود را برای تدریس اعلام نماید.که این دو جدول رابطه چند به چند با هم دارند.
یعنی یک جدول دروس استاد ویکی روزهایی که استاد در اختیار دانشگاه قرار میدهد.و جدول استاد هم بین این دو قرار دارد.
من میخواهم روز اولی رو که استاد در اختیار دانشگاه قرار داده است را به درس اول اختصاص دهمو به همین ترتیب روز دوم را برای درس دوم و ...
ممنون میشم کمکم کنید
من این sp را نوشتم ولی مشکلش این هست که اولین روز در اختیار استاد ر ا برای همه دروس قرار میدهدو بقیه را در نظر نمیگیرد.
ALTERPROCEDURE [dbo].[UpdateFirstDateTerm2]
as
UPDATE [Plan].[dbo].Lesson
SET StartDate =FirstDate
FROM dbo.TecherDays innerjoin
dbo.Lesson ON dbo.TecherDays.TecherCode = dbo.Lesson.Techer_Code
where dbo.TecherDays.TecherCode = dbo.Lesson.Techer_Code

با تشکر

محمد سلیم آبادی
پنج شنبه 18 فروردین 1390, 10:50 صبح
از SQL Server چند استفاده می کنین؟ 2005 به بالا؟

nAVA470
پنج شنبه 18 فروردین 1390, 11:03 صبح
sql server 2008 r2 استفاده میکنم

محمد سلیم آبادی
پنج شنبه 18 فروردین 1390, 11:21 صبح
اگر جواب دقیق می خوایین باید ساختار جداولتون همراه با تعدادی سطر نمونه و نتیجه مورد نظر رو ارسال کنید.
به هر حال روی حدسیاتم اینو نوشتم:

UPDATE D2
SET StartDate =FirstDate
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY TecherCode ORDER BY TecherCode) rnk
FROM dbo.TecherDays) AS D1
JOIN
(SELECT *, ROW_NUMBER() OVER(PARTITION BY TecherCode ORDER BY TecherCode) rnk
FROM dbo.Lesson) AS D2
ON D1.rnk = D2.rnk
AND D1.TecherCode = D2.TecherCode;

nAVA470
شنبه 20 فروردین 1390, 08:04 صبح
جدول دروس به این ترتیب است

Lesson_Code Techer_Code StartDate
1----150-----1389/7/7
2----107-----1389/7/4
3----107-----1389/7/7
4----36-----1389/7/4
5----150-----1389/7/7

و جدول اولین روزی که استاد میتواند در اختیار دانشگاه قرار دهد به این ترتیب است

ID----TecherCode----FirstDate
9----91----1389/7/7
10----91----1389/7/7
11----107----1389/7/5
12----107----1389/7/6
13----107----1389/7/4
14----150----1389/7/7

کد شما خیلی عالی است ولی من هنوز موفق نشده ام . اگه میشه یک کم در موردPARTITION BY و کاربرداش توضیح بیشتری بدید ممنون میشم
دقیق اگه سوالمو مطرح کنم اینه که میخواهم StartDate مربوط به جدول اولین روزی که استاد در احتیار دانشگاه قرار میدهد در جدول دروس update شود.
مثلا تاریخ 5/7/1389 مربوط به استاد 107 وتاریخ 6/7/1389مربوط به استاد 107 از جدول روزهای اساتید firstdateدر جدول بالایی(دروس)در فیلد startdate برای دروس 2 و 3 به ترتیب برای استاد 107 update شود.


من فکر میکنم کدی که شما نوشتید ابتدا برای هر جدول بر اساس استاد یک ردیف ایجاد میکند،سپس بین این ردیفها و کد استاد ارتباط بقرار میکند درست میگم؟

محمد سلیم آبادی
شنبه 20 فروردین 1390, 10:08 صبح
قبل از هر چیزی عنوان تاپیک را به "مشکل در Update یک جدول بر اساس جدول دیگر" تغییر نام دهید.
واقعیتش چند بار متن توضیحات رو خواندم ولی مطمئن نیستم که درست نیازتون رو فهمیده باشم یا نه.
طبق توضیحات قرار بر این شد اولین تاریخ های مربوط به هر مدرس در جدول TecherDays در صورتی که با TecherCode جدول Lessons جور و مچ شد برای فیلد StartDate در نظر گرفته شود.
و مثالی که زده شد با توضیحات جور نمیشن. چرا که مثال بر پایه ی مدرس با شماره 107 بود که در جدول Lessons همچین مدرسی وجود نداره.

nAVA470
شنبه 20 فروردین 1390, 10:32 صبح
من نمیتونم عنوان رو تغییر بدم از کجا باید برم.؟
من همه اطلاعات رو نیاورده بودم ،به همین خاطر کد 107 رو نداشت ،مثال رو اصلاح کردم .
لطفا دوباره بخونیدش

محمد سلیم آبادی
شنبه 20 فروردین 1390, 10:35 صبح
الان اصلاح کردین مثالتون رو؟
بازم که در جدول دروس استاد شماره 107 با درس 4 ارتباطی نداره!

این کد رو امتحان کنید من فکر می کردم قبلا در قسمت ORDER BY این نیازها رو برطرف کرده بودم:


UPDATE D2
SET StartDate =FirstDate
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY TecherCode ORDER BY FirstDate) rnk
FROM dbo.TecherDays) AS D1
JOIN
(SELECT *, ROW_NUMBER() OVER(PARTITION BY TecherCode ORDER BY LessonCode) rnk
FROM dbo.Lesson) AS D2
ON D1.rnk = D2.rnk
AND D1.TecherCode = D2.TecherCode;

محمد سلیم آبادی
شنبه 20 فروردین 1390, 10:37 صبح
من نمیتونم عنوان رو تغییر بدم از کجا باید برم.؟
من همه اطلاعات رو نیاورده بودم ،به همین خاطر کد 107 رو نداشت ،مثال رو اصلاح کردم .
لطفا دوباره بخونیدش
اگر خاطرم باشه بایستی از طریق ویرایش یا "ابزارهای تاپیک" که در بالا قرار داره استفاده کنید.

nAVA470
شنبه 20 فروردین 1390, 11:47 صبح
بازم نمیشه
همه چیز به نظر درسته

محمد سلیم آبادی
شنبه 20 فروردین 1390, 12:06 عصر
در مورد این چطور:

declare @lesson table
(lessonCode int not null primary key,
TecherCode int not null,
StartDate date);

insert @lesson values
(1,150,'1389/7/7'),
(2,107,'1389/7/4'),
(3,107,'1389/7/7'),
(4,36,'1389/7/4'),
(5,150,'1389/7/7');


declare @TecherDays table
(id int not null primary key,
techerCode int not null,
firstDate date);

insert @TecherDays values
(9,91,'1389/7/7'),
(10,91,'1389/7/7'),
(11,107,'1389/7/5'),
(12,107,'1389/7/6'),
(13,107,'1389/7/4'),
(14,150,'1389/7/7');

select * from @lesson
/*
lessonCode TecherCode StartDate
----------- ----------- ----------
1 150 1389-07-07
2 107 1389-07-04
3 107 1389-07-07
4 36 1389-07-04
5 150 1389-07-07
*/
UPDATE D2
SET D2.StartDate =D1.FirstDate
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY TecherCode ORDER BY ID ASC) rnk
FROM @TecherDays) AS D1
JOIN
(SELECT *, ROW_NUMBER() OVER(PARTITION BY TecherCode ORDER BY LessonCode) rnk
FROM @lesson) AS D2
ON D1.rnk = D2.rnk
AND D1.TecherCode = D2.TecherCode;

select * from @lesson
/*
lessonCode TecherCode StartDate
----------- ----------- ----------
1 150 1389-07-07
2 107 1389-07-05
3 107 1389-07-06
4 36 1389-07-04
5 150 1389-07-07
*/