PDA

View Full Version : سوال: شماره دادن به داده‌ها هنگام ورود



smakhavan
سه شنبه 17 فروردین 1389, 16:50 عصر
سلام
من دو تا جدول دارم كه ميخواهم اطلاعات يكي را در ديگري وارد كنم و هنگام وارد شدن اطلاعات از جدول اول به دوم براساس گروه (CODE) شماره دهي صورت بگيره (يه فيلد اضافي پر بشه) به اين صورت :


جدول اول
ID CODE
1 1
2 1
3 2
4 3
5 1
6 2
7 3
8 1
9 1
10 2

جدول دوم
ID CODE D
1 1 1
2 1 2
3 2 1
4 3 1
5 1 3
6 2 2
7 3 2
8 1 4
9 1 5
10 2 3

يعني به اونهايي كه ستون كد مشابهي دارند به كد جديد از يك تا ... داده بشه
چه جوري بايد اين كار را انجام بدهم

محمد سلیم آبادی
سه شنبه 17 فروردین 1389, 16:55 عصر
INSERT INTO table_2
SELECT ID,
CODE,
D = ROW_NUMBER() OVER(PARTITION BY CODE ORDER BY ID)
FROM table_1

smakhavan
سه شنبه 17 فروردین 1389, 17:20 عصر
پيغام خطاي زير را ميده
'ROW_NUMBER' is not a recognized function name.

من از SQL server 2000 استفاده مي‌كنم

محمد سلیم آبادی
سه شنبه 17 فروردین 1389, 17:23 عصر
INSERT INTO table_2 (ID, CODE, D)
SELECT ID,
CODE,
(SELECT COUNT(*)
FROM table_1 AS t1
WHERE t1.CODE = t2.CODE
AND t1.ID <= t2.ID) AS D
FROM table_1 AS t2;

smakhavan
سه شنبه 17 فروردین 1389, 17:44 عصر
خيلي خيلي تشكر از پاسخ دقيق شما
ولي يه سوال مي مونه
اگه داده هاي جديد بخواهم تو اين جدول (table2) وارد كنم دوباره شماره را براي هر گروه از يك شروع ميكنه!!:گریه:

محمد سلیم آبادی
سه شنبه 17 فروردین 1389, 17:54 عصر
ضروریتی وجود داره که ستون D بطور فیزیکی در نظر گرفته بشه؟ منظور اینه که یک VIEW روی جدول دوم ایجاد کنید که این ستون را با کمک یک عبارت بدست آورد. و فقط کافیه همان دو ستون ID و CODE را هر سری در جدول دوم درج کنید. و هنگام نمایش از VIEW سلکت بگیرین.

smakhavan
سه شنبه 17 فروردین 1389, 18:09 عصر
آخه داده هاي ورودي من از چند تا ورودي مياد و Import ميشه و توي جدول table2 ذخيره ميشه و بعد از كد موجود در D به كرات استفاده ميشه و حجم اطلاعات هم زياده
ميخواهم هر دفعه مجبور نباشم كه كوئري بگيرم.
مهمتر از اون وقتيه كه يكي از داده حذف بشه، اونوقت كد همه زير مجموعه ها عوض ميشه و كار كلا ميريزه به هم!!

آيا راهي نداره كه Count استفاده شده با max موجود در table2 جمع بشه؟
:خجالت:

محمد سلیم آبادی
سه شنبه 17 فروردین 1389, 18:16 عصر
راهی که به نظرم می رسه اینه که بعد از هر INSERT با کمک یک Trigger یا SP دوباره تمام مقادیر ستون D را UPDATE کنید. در اینجا دیگه نیازی نیست که هنگام درج این مقدار تولید بشه. البته به نظر میرسه این روش به دلیل UPDATE های مکرر هزینه ی زیادی هم به سیستم متحمل کنه.
اگر با این مورد موافق هستین میتونم عبارت update رو برایتان بنویسم.

البته فراموش کردم که بگم: بعد از هر حذف، ویرایش... بازم نیاز به UPDATE وجود داره!

smakhavan
سه شنبه 17 فروردین 1389, 18:30 عصر
مشكل اين كار اينه كه از اين D در جداول ديگري هم به عنوان كد شناسايي استفاده ميشه (به عبارت ديگه از اين كد D براي و چند كد ديگه براي توليد يك كد نهايي استفاده ميشه كه اون كد در واقع كد شناسايي يك فرد هستش)

براي همين نميشه بعد از حذف يك رديف از جدول دوباره به همه كد جديد داد!
چيزي كه من ميخواهم در واقع يك ستون شبيه Identity خود SQL هست با اين تفاوت كه بايد با يك پارامتر (ستون code) توليد بشه و مثلا ستونهاي id بعد از حذف حتي آخرين رديف كد جديد توليد بشه (چون اون كد قبلا استفاده شده و ممكنه كه كد شناسايي براساس اون توليد شده باشه)
* البته اين آخري را يك كم احتمالش خيلي كمه!! ولي اين كه بعد از هر آپديت يا حذف بخواهيم كد دوباره بدهيم غير ممكنه

باز هم تشكر

محمد سلیم آبادی
سه شنبه 17 فروردین 1389, 18:48 عصر
تا حدودی متوجه منظورتون شدم. تا حالا با همچنین نیازی مواجه نشدم. باید دید مکانیزم خصیصه ی IDENTITY چگونست که حتی بعد از حذف سطرها، مقداری که تولید میشه یک مقدار از آخرین مقدار تولید شده بیشتر است. سپس این مکانیزم رو شبیه سازی کنید.

امید وارم دوستان دیگه بتونن شما رو راهنمایی کنند.
موفق باشید.

smakhavan
چهارشنبه 18 فروردین 1389, 08:24 صبح
سلام
من اين قضيه را با اين كوئري حل كردم

SELECT s.ID, s.CODE, k.MaxD + s.D AS NewID
FROM (SELECT ID, CODE,
(SELECT COUNT(*)
FROM table1 AS t1
WHERE t1.CODE = t2.CODE AND t1.ID <= t2.ID) AS D
FROM dbo.Table1 t2) s INNER JOIN
(SELECT MAX(D) AS MaxD, CODE
FROM dbo.Table2
GROUP BY CODE) k ON s.CODE = k.CODE

به نظر اساتيد راه بهتري وجود داره يا نه؟