PDA

View Full Version : Update کردن یه جدول توسط داده های جدول دیگر



Mahdi_20
دوشنبه 04 آبان 1388, 14:01 عصر
من میخوام اطلاعات (مثلا کد) یه جدول رو بخونم و تمامی کدها رو به یه جدول دیگه اضافه کنم.
کوئری به چه شکله؟

amin_alexi
دوشنبه 04 آبان 1388, 19:11 عصر
insert tbl1 (Code)
Select Code From tbl2

تمام کدها رو از جدول tbl2 به جدول tbl1 انتقال میده

محمد سلیم آبادی
دوشنبه 04 آبان 1388, 19:52 عصر
عنوان تاپیک کمی با متن تاپیک متفاوت است.

اگر می خواهین مقادیر یک یا چند ستون از جدول توسط یک جدول دیگر (با کمک یک ستون مشترک مثل کلید) بروزرسانی شوند از مبحثی به نام UPDATE Using Joins میتوانید استفاده کنید.

مثال:



BEGIN TRAN

UPDATE O
SET ShipCountry = C.Country,
ShipRegion = C.Region,
ShipCity = C.City
FROM dbo.Orders AS O
JOIN dbo.Customers AS C
ON O.CustomerID = C.CustomerID
WHERE C.Country = 'USA';

ROLLBACK TRAN

Mahdi_20
سه شنبه 05 آبان 1388, 07:47 صبح
عذر میخوام از اینکه خواستم رو نتونستم درست بیان کنم:
من سه تا جدول دارم 1- پرسنل 2-کالا 3- سهمیه : (شناسه پرسنل، کد کالا، تعداد سهمیه) ،من میخوام به پرسنلی که مثلا تو یه واحد خاص هستند، سهمیه ای(5 عدد) از کالایی با کد (100) بدم .
** نکته ای که مورد اهمیت هست اینه که ممکنه شناسه پرسنل از قبل تو جدول سهمیه وجود نداشته باشه (اگه هست Update و اگه نیست Insert بشه)
و نهایتا تو جدول سهمیه ذخیره کنم

محمد سلیم آبادی
سه شنبه 05 آبان 1388, 08:55 صبح
آیا کلید اصلی جدول سهمیه ستون "شناسه ی پرسنل" است؟ (یعنی جدول سهمیه با جدول پرسنل ارتباط یک به یک دارند؟)

از چه نسخه ی SQL استفاده می کنید؟ (2008 ؟)

Mahdi_20
سه شنبه 05 آبان 1388, 09:15 صبح
با تشکر از توجه شما..
نه، شناسه پرسنل و کد کالا کلید اصلی رو تشکیل میدن (پرسنل P1 چند سهمیه از کالای O1 رو داره؟)
از نسخه 2005 استفاده میکنم.

محمد سلیم آبادی
سه شنبه 05 آبان 1388, 09:16 صبح
فرض کنید که نام ستون های جدول سهمیه به قرار زیر است:
ستون شناسه پرسنل = PersonID و نام ستون کالا = Kala و تعداد سهمیه = Num

اگر از نسخه 2008 استفاده می کنید می توانید از MERGE نیز بهره ببرید.




--=============== Procedural Method
Create Procedure GiveSahmiye
@PersonID int,
@KalaID int,
@Num int
AS

If Not Exists (Select * From Sahmiye Where PersonID = @personID
AND Kala = @KalaID)
Insert Into Sahmiye Values (@PersonID, @KalaID, @Num)

Else
Update Sahmiye
Set Kala = @KalaID,
Num = @Num
Where PersonID = @PersonID
AND kala = @KalaID

--=============== Merging Data
Declare @Temp Table
(
PersondID int primary key,
KalaID int,
Num int
)

Insert Into @Temp Values (@PersonID, @KalaID, @Num)

MERGE INTO Sahmiye AS TGT
USING @Temp AS SRC
ON TGT.personid = SRC.personid
AND TGT.kala = SRC.kala
WHEN MATCHED THEN
UPDATE SET
TGT.Kala = SRC.Kala,
TGT.Num = SRC.Num
WHEN NOT MATCHED THEN
INSERT (persondID, kalaID, Num)
VALUES (SRC.persondID, SRC.KalaID, SRC.Num);

محمد سلیم آبادی
سه شنبه 05 آبان 1388, 09:19 صبح
با تشکر از توجه شما..
نه، شناسه پرسنل و کد کالا کلید اصلی رو تشکیل میدن (پرسنل P1 چند سهمیه از کالای O1 رو داره؟)
از نسخه 2005 استفاده میکنم.

پس منظورتان از جمله ی "ممکنه شناسه پرسنل از قبل تو جدول سهمیه وجود نداشته باشه " این است که ترکیب شناسه پرسنل با کد کالا در جدول سهمیه قبلا وجود نداشته باشد. همینطور است؟

Mahdi_20
سه شنبه 05 آبان 1388, 09:29 صبح
درسته..و اگه وجود نداشت Insert در غیر اینصورت Update بشه

Mahdi_20
سه شنبه 05 آبان 1388, 09:36 صبح
آهان.. مشکل اصلی اینکه من perSonalId ندارم بلکه لیستی از پرسنل دارم ..

محمد سلیم آبادی
سه شنبه 05 آبان 1388, 09:55 صبح
مشکلی نداره! کافیه حاصل پرسنل ها را (که از یک پرس و جو بدست میاد) با سطر کدکالا و تعداد، ضرب دکارتی کرده و داخل یک جدول متغیری ذخیره ....
به نظر میرسه جوابی که دنبالشیم همان اولین پست من باشه!

محمد سلیم آبادی
سه شنبه 05 آبان 1388, 10:19 صبح
با کمک Cursor یعنی Row-By-Row Modification و ضرب دکارتی (Cartesian Product) مساله را حل کردم.




Set NoCOunt On;

Declare @Sahmiye Table
(
PersonID char(2),
Kala char(2),
Num int,
Unique(PersonID, kala)
)
Insert Into @Sahmiye values ('p1', 'O1', 10)
Insert Into @Sahmiye values ('p1', 'O2', 8)
Insert Into @Sahmiye values ('p3', 'O1', 5)
Insert Into @Sahmiye values ('p2', 'O3', 10)
Insert Into @Sahmiye values ('p5', 'O1', 10)

Select * From @Sahmiye
/*
PersonID Kala Num
-------- ---- -----------
p1 O1 10
p1 O2 8
p3 O1 5
p2 O3 10
p5 O1 10
*/

Declare @Person Table (PersonID char(2))
Insert Into @Person Values ('p1')
Insert Into @Person Values ('p2')
Insert Into @Person Values ('p3')
Insert Into @Person Values ('p4')

--Once many sahmiye
Declare @Kala_Num Table (Kala char(2), num int)
Insert Into @Kala_Num Values ('O1', 5)

Declare @Product Table (PersondID char(2), kala char(2), num int)
Insert Into @Product
Select PersonID, Kala, num
From @Person CROSS JOIN @Kala_Num

Select * From @Product
/*
PersondID kala num
--------- ---- -----------
p1 O1 5
p2 O1 5
p3 O1 5
p4 O1 5
*/

--Cursor
Declare @PersonID char(2),
@Kala char(2),
@Num int

Declare C Cursor
For Select * From @product

Open C
Fetch Next From C Into @PersonID, @Kala, @Num
WHILE (@@FETCH_STATUS=0)
BEGIN
If Not Exists (Select * From @Sahmiye Where PersonID = @personID
AND Kala = @Kala)
Insert Into @Sahmiye Values (@PersonID, @Kala, @Num)

Else
Update @Sahmiye
Set Kala = @Kala,
Num = @Num
Where PersonID = @PersonID
AND kala = @Kala


FETCH NEXT FROM C INTO @PersonID, @Kala, @Num
END

CLOSE C
DEALLOCATE C


Select * From @Sahmiye
/*
PersonID Kala Num
-------- ---- -----------
p1 O1 5
p1 O2 8
p3 O1 5
p2 O3 10
p5 O1 10
p2 O1 5
p4 O1 5
*/