PDA

View Full Version : افزودن یک رکورد جدید بین دو رکورد در بانک اطلاعاتی



hamedkarimi
دوشنبه 23 فروردین 1389, 09:34 صبح
سلام دوستان عزیز
در بانک اطلاعاتی Sql server چطور میتونیم یک رکورد جدید رو بین دو رکورد موجود در بانک اطلاعاتی ذخیره کنیم
من خودم فکر می کنم که راه حلش در استفاده از اشاره گر ها باشه به صورتی که هر رکورد دارای یک ساب آی دی باشه که به رکورد مادر و در واقع به رکورد ما قبل خودش اشاره کنه
ولی چیزی که واسم مهمه که چطوری اینکار رو با اشاره گر ها میشه انجام داد
شما چه راه حلی رو پیشنهاد می کنید ...

mollyAreco
دوشنبه 23 فروردین 1389, 09:46 صبح
سلام
ببین منظور سوالتو درست متوجه نمیشم اگر منظورت اینکه در یک جدول رکوردهایی داری که این رکوردها دارای فیلدی هستند که این فیلد بر اساس اعداد متوالی پر نمی شه و می خوای رکورد جدید بین دو رکورد در این فیلد اضافه بشه اما یک فیلد بعنوای کلید اصلی داری که اعداد متوالی دارن. این کار راحت دو تا عدد رو پیدا می کنی و عدد جدیدت رو برابر عدد کوچکتر بعلاوه یک می زاری .
اگر سوالت غیر از اینکه بیشتر توضیح بده .

ASKaffash
دوشنبه 23 فروردین 1389, 09:49 صبح
سلام
دو روش :
1- یک فیلد عددی در جدول که توسط برنامه تولید می شود و هنگام درج مقدار بین دو مقدار از نقطه مورد نظر Shift اعداد صورت می گیرد
2- دو فیلد عددی که هر فیلد مقدار رکورد قبلی را نگهداری میکند (این روش Select سختی خواهد داشت)

hamedkarimi
دوشنبه 23 فروردین 1389, 09:58 صبح
ممنون از جوابتون
در توضيح بیشتر باید بگم که آقاي ASKaffash منظور منو خوب درک کردن
اما در جواب ایشون در حالت اول که گفتين اینکار تراکنش زیادی رو برای دیتابیس خواهد داشت چون ما در هر لحظه که بخواهیم یک رکورد جدید اضافه کنیم باید کلیه مقادیر شیفت بشن
من دنبال راه حل مورد دوم شما هستم
واسه توضیح بیشتر در مثال زیر دو تا فیلد به نام id و subid داریم که در هر رکورد subid مقدار فیلد id رکورد قبل است ، من به طور مثال یک رکورد جدید تحت id=7 اضافه کردم که باید بعد از تراکنش بعد از رکورد با id=3 قرار بگیره
توضيح اضافه اینکه من فکر میکنم باید طوری رفتار کرد که بعد از افزودن رکورد ها به صورت زیر با یک دستور روی همه رکورد ها یک update تحت عنوان فیلد NEWID انجام داد و با اینکار یک فیلد با مقادیر مرتب خواهیم داشت که میتوانیم در مراحل بعدی مرتب سازی را بر اساس فیلد جدید انجام داد



ID SUBID
0 0
1 0
2 1
3 2
4 7
5 4
6 5
7 3

محمد سلیم آبادی
دوشنبه 23 فروردین 1389, 19:22 عصر
سلام،
برای درج بین دو رکورد مشکلی وجود ندارد. کافیه از Update استفاده بشه. همانطور که خودتون بهش اشاره کردین.
راجب Sort نیاز هست از یک الگوریتم بازگشتی استفاده بشه. که من راحتتر از CTE روشی رو سراغ ندارم. البته این CTE قابل استفاده در نسخه ی 2000 نیست.
declare @t table (ID int, SUBID int)
insert @t values
(0, NULL),
(1, 0),
(2, 1),
(3, 2),
(4, 3),
(5, 4),
(6, 5)

BEGIN TRAN
UPDATE @t
SET SUBID = 7
WHERE SUBID = 3
INSERT INTO @t VALUES (7, 3)
COMMIT TRAN

;WITH CTE AS
(
SELECT ID, SUBID, [Level] = 1
FROM @t
WHERE SUBID IS NULL

UNION ALL
SELECT T.ID, T.SUBID, [Level] + 1
FROM CTE
JOIN @t AS T
ON T.SUBID = CTE.ID
)
SELECT * FROM CTE
ORDER BY [Level];
/*
ID SUBID Level
----------- ----------- -----------
0 NULL 1
1 0 2
2 1 3
3 2 4
7 3 5
4 7 6
5 4 7
6 5 8
(8 row(s) affected)
*/

hamedkarimi
دوشنبه 23 فروردین 1389, 23:32 عصر
جناب msalim بسیار تا بسیار ممنونم الگوریتم جالبی بود
بازم تشکر زیادی ازتون میکنم چون چند روزی بود که گرفتار این مشکل بودم و نمی دونستم که چطوری حلش کنم
خدا خیرت بده
موفق باشی
:تشویق::تشویق::تشویق: