ورود

View Full Version : دستوری که رکوردهایی که فیلد last_modified آنها که کوچکتر است پاک شود؟



ali_abbasi22145
شنبه 02 دی 1391, 15:31 عصر
سلام
بانک من SQL SERVER 2008 R2 است و فیلد sicard من Identify می باشد
من دستور زیر را نوشتم و رکوردهای تکراری را به خوبی پاک می کند.

delete CardTable Where sicard Not in ( Select Min ( sicard ) From CardTable Group by employee_number )

حال می خواهم با کمک دستور بالا رکوردهایی که فیلد last_modified آنها که کوچکتر است پاک شود؟

محمد سلیم آبادی
یک شنبه 03 دی 1391, 15:34 عصر
دوست گرامی،
می تونی یک نمونه از داده های جدولت رو پست کنی و بگی دقیقا چه سطرهایی و بر چه اساسی حذف شوند؟
الان last_modified که اشاره شد، کوچکتر از چه مقداری باشد تا حذف شود؟ لازم دقیق تر و شفاف تر توضیح بدین.

ali_abbasi22145
سه شنبه 05 دی 1391, 10:45 صبح
سلام وتشکر
رکورد اول داریم نام:علی نام خانوادگی :حسینی و کدپرسنلی 100و last_modified آن 5/6/2012 (تاریخ تغییر ازجنس datetime)
رکورد دوم داریم نام:علی نام خانوادگی :حسینی و کدپرسنلی 100و last_modified آن 1/1/2005 (تاریخ تغییر ازجنس datetime)

رکورد دوم که تاریخ تغییر آن 1/1/2005 قدیمی تر (کوچکتر) حذف شود

mohsen24000
سه شنبه 05 دی 1391, 11:34 صبح
شرح کوئری:
ردیف هایی که last_modified اونها از ماکزیموم last_modified که کد پرسنلی برابری دارند، کوچکتر هستند رو حذف کن.

ali_abbasi22145
سه شنبه 05 دی 1391, 12:10 عصر
سلام
راه حل:
delete CardTable Where last_modified Not in ( Select max ( last_modified ) From CardTable Group by employee_number )

محمد سلیم آبادی
سه شنبه 05 دی 1391, 13:40 عصر
جناب علی عباسی،
مراقب باشین، کدتون خیلی خطرناکه، اگه منظورتون اینه که به ازای هر پرسنلی تمام سطرهاش به غیر از اونی که دارای بزرگترین مقدار در ستون last_modified هست حذف بشن کوئریتون کاملا اشتباست!

به تصویر زیر توجه بفرمایید، کوئری شما با داده های مذکور چه میکنید. فقط یک سطر رو حذف میکنه!
97204

اگه راه حل صحیح میخواهین گزاره حاج محسن رو تبدیل به زبان SQL کنید که یک فرم پیاده سازیش به این شکل هست:

;with cte as
(select *,
row_number()
over(partition by employee_number
order by last_modified desc) as rnk
from CardTable)
Delete cte where rnk > 1;

ali_abbasi22145
چهارشنبه 06 دی 1391, 15:32 عصر
سلام و تشکر
من از دلفی 7 استفاده می کنم و خیلی از دستورات را ایراد می گیرد مثل:row_number()
و نمی توانم استفاده کنم

mohsen24000
چهارشنبه 06 دی 1391, 15:39 عصر
جسارتا! دلفی 7 چه ربطی داره به Row_Number در اسکیوال سرور!!؟
باید ببینید شما این دستورات SQL رو روی چه دیتابیس و انجینی اجرا می کنید. طبیعتا این دستورات روی مثلا AbsDbase ، SQLite و امثالهم اجرا نمیشه و بایستی رو نسخه های جدید SQL Server اجراشون کرد...

ali_abbasi22145
چهارشنبه 06 دی 1391, 15:47 عصر
سلام
شاید این مورد اینجا مناسب نباشد دستور من در دلفی7 کار حذف به خوبی انجام می دهد و بعد اتمام کار این خطا که نشان می دهد و چطوری از شر این خطا خلاص شوم.
Commandtext dos not return a result set

with ADOQuery_Delete_Condition do
begin
//Active := False;
SQL.Clear;
SQL.Add(' delete CardTable Where '+Field_name3+' Not in ( Select max ( '+ Field_name3+' ) From CardTable Group by ' +Field_name1+ ' ) ');
ExecSQL;
Open;
insert;
Cancel;
end;

ADOQuery_Delete_Condition.Requery();

ali_abbasi22145
چهارشنبه 06 دی 1391, 15:50 عصر
جسارتا! دلفی 7 چه ربطی داره به Row_Number در اسکیوال سرور!!؟
باید ببینید شما این دستورات SQL رو روی چه دیتابیس و انجینی اجرا می کنید. طبیعتا این دستورات روی مثلا AbsDbase ، SQLite و امثالهم اجرا نمیشه و بایستی رو نسخه های جدید SQL Server اجراشون کرد...
سلام
درسته که در SQL Server 2008 اجرا می شه ولی من با ADO دلفی 7 به sql server 2008 وصل می شم که یکسری دستورات جدید sql server 2008 پشتیانی نمی کند.

محمد سلیم آبادی
چهارشنبه 06 دی 1391, 15:51 عصر
سلام و تشکر
من از دلفی 7 استفاده می کنم و خیلی از دستورات را ایراد می گیرد مثل:row_number()
و نمی توانم استفاده کنم
منظورتون اینه که چون مثلا row_number ساپورت نمیشه تو دلفی باید از کوئری اشتباهتون استفاده کنید.
این کوئری چطور، اینم در دلفی در هنگام اجرا با مشکل مواجه میشه؟

delete from CardTable
where last_modified <
(select max(C.last_modified)
from CardTable C
where C.employee = CardTable.employee);

mohsen24000
چهارشنبه 06 دی 1391, 16:18 عصر
ببینید! شما وقتی Insert، Update و Delete رو انجام می دید، طبیعتا RecordSet به شما بر نمی گردونه! پس باید کوئری رو Execute کنید تا خطا دریافت نکنید.
دستور Row_Number در SQLServer 2008 اجرا میشه و مشکلی نداره!!
بنده خودم الان دارم با ADO و SQLServer2008 از همین دستور استفاده می کنم.
شما برای تست هم که شده یه SP بسازید و با ADO StoredProc این کار رو انجام بدید باز ببینید مشکلی دارید یا خیر!؟

ali_abbasi22145
پنج شنبه 07 دی 1391, 09:15 صبح
جناب علی عباسی،
مراقب باشین، کدتون خیلی خطرناکه، اگه منظورتون اینه که به ازای هر پرسنلی تمام سطرهاش به غیر از اونی که دارای بزرگترین مقدار در ستون last_modified هست حذف بشن کوئریتون کاملا اشتباست!

به تصویر زیر توجه بفرمایید، کوئری شما با داده های مذکور چه میکنید. فقط یک سطر رو حذف میکنه!

97204

اگه راه حل صحیح میخواهین گزاره حاج محسن رو تبدیل به زبان SQL کنید که یک فرم پیاده سازیش به این شکل هست:

;with cte as
(select *,
row_number()
over(partition by employee_number
order by last_modified desc) as rnk
from CardTable)
Delete cte where rnk > 1;


سلام
کورئی من خیلی تست کردم و مشکلی ندیدم ، من می خواهم تمام رکوردهایی که کدپرسنلی آنها یکی است منهای رکوردی که last_modified آن جدیدتر است بماند(یعنی با یک کدپرسنلی فقط last_modified آن جدیدتر است بماند)
منظورتان را دقیقا متوجه نشدم.

ali_abbasi22145
پنج شنبه 07 دی 1391, 10:01 صبح
منظورتون اینه که چون مثلا row_number ساپورت نمیشه تو دلفی باید از کوئری اشتباهتون استفاده کنید.
این کوئری چطور، اینم در دلفی در هنگام اجرا با مشکل مواجه میشه؟

delete from CardTable
where last_modified <
(select max(C.last_modified)
from CardTable C
where C.employee = CardTable.employee);

سلام
این هم مثل کوئری من کار می کند و فرقی با کوئری من در عملکرد ندیدم!

ali_abbasi22145
پنج شنبه 07 دی 1391, 10:06 صبح
ببینید! شما وقتی Insert، Update و Delete رو انجام می دید، طبیعتا RecordSet به شما بر نمی گردونه! پس باید کوئری رو Execute کنید تا خطا دریافت نکنید.
دستور Row_Number در SQLServer 2008 اجرا میشه و مشکلی نداره!!
بنده خودم الان دارم با ADO و SQLServer2008 از همین دستور استفاده می کنم.
شما برای تست هم که شده یه SP بسازید و با ADO StoredProc این کار رو انجام بدید باز ببینید مشکلی دارید یا خیر!؟

سلام
یک مثل استفاده Execute اینجا بگذارید آیا منظورتون ExecSQL است؟

دلفی شما ورژنش بالاتر از دلفی 7 است ، ورژن دلفی شما چنده؟

ali_abbasi22145
پنج شنبه 07 دی 1391, 10:46 صبح
سلام
پیدا کردم رفع ان خطا را :
This will re-execute the query again, expecting a result set.
You should not set Active to True (or False again) when using with
UPDATE (or INSERT/DElETE) commands that to not return result sets.
ExecSQL is enough
do not use Requery ....