PDA

View Full Version : سوال: فوری!! پيدا کردن رکورد تکراري جداول



alborzi_66
شنبه 19 مرداد 1387, 01:03 صبح
باعرض سلام من برنامه اي به زبان دلفي و ديتا بيس اس کيو ال سرورمي خواستم که مثلا3تا جدول داريم و فقط يک رکورد id بيشتر نداره , کار اين برنامه پيدا کردن رکورد تکراري جداول و
ذخيره , نمايش اون تو يه جدول جديد نامres
اسم جداولa,b,c
این برنامه من هستش :

procedure TSEARCH.Button1Click(Sender: TObject);
var
query,values :string;
tedad:integer;
begin
dbgrid1.DataSource:=DataSource1;
//select on a
adoquery1.Close;
adoquery1.SQL.Clear;
query:='SELECT * FROM a WHERE (id =';
query:=query+edit1.Text+')';
adoquery1.SQL.Add(query);
DataSource1.DataSet.Active:=true;
adoquery1.ExecSQL;
tedad:=adoquery1.RecordCount;
//select on b
adoquery1.Close;
adoquery1.SQL.Clear;
query:='SELECT * FROM b WHERE (id =';
query:=query+edit1.Text+')';
adoquery1.SQL.Add(query);
DataSource1.DataSet.Active:=true;
adoquery1.ExecSQL;
tedad:=tedad+adoquery1.RecordCount;
//select on c
adoquery1.Close;
adoquery1.SQL.Clear;
query:='SELECT * FROM c WHERE (id =';
query:=query+edit1.Text+')';
adoquery1.SQL.Add(query);
DataSource1.DataSet.Active:=true;
adoquery1.ExecSQL;
tedad:=tedad+adoquery1.RecordCount;
edit2.Text:=inttostr(tedad);
//inset to res
query:='INSERT INTO res (id, tedad) VALUES (';
query:=query+edit1.Text+','+inttostr(tedad)+')';
adocommand1.CommandText:=(query);
DataSource1.DataSet.Active:=true;
adocommand1.Execute;
end;

فقط قسمت پيدا کردن رکورد تکراري مونده که دوستم اون رو نوشته اما جواب نمیده نمیدونم این قسمتو کجا ی برنامه بنویسم از قسمت create Procedure FindRepeatedBook خطا میده
اینم تیکه برنامه اونه
create Procedure FindRepeatedBook
as
Declare Curs cursor FAST_FORWARD
For
Select id From A where id in
(Select id From B Where id in
(Select id From C where id in
))

declare @ID yourType

open curs
fetch next From curs into @ID

delete from Med
while @@Fetch_Status = 0
begin
insert into res (ID) values (@Id)
fetch next From curs into @ID
end;

select * From res

close curs
deallocate curs
go

DotNet_King
شنبه 19 مرداد 1387, 14:45 عصر
فک می کنم باید با گروپ بای و دستور هوینگ کار کنی
احتمالا یه کدی شبیه به این می خواهی



SELECT [dbo].[tblstudent].[stID],count(*) from [dbo].[tblstudent]
group by stID
having count(*)>1
GO


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

با این کار آی دی هایی که بیش از یه بار تکرار بشند رو خروجی میده ستون دوم هم دفعات تکراره

alborzi_66
شنبه 19 مرداد 1387, 15:08 عصر
ممنونم میشه در مورد این دستور بیشتر بگین برا چیه و کجای برنامه اضافه کنم

z.nasiri
شنبه 19 مرداد 1387, 23:57 عصر
سلام
دستور distinct تکراری ها تون را حذف می کنه و با استفاده از not in می تونید متوجه بشید چی نیست

و این طوری هر دو را با هم استفاده می کنی
select * from [table]
where [filed] not in (select distinct [fild] from [table](

رضا جاسبی
یک شنبه 20 مرداد 1387, 23:28 عصر
سلام
دستور distinct تکراری ها تون را حذف می کنه و با استفاده از not in می تونید متوجه بشید چی نیست

و این طوری هر دو را با هم استفاده می کنی
select * from [table]
where [filed] not in (select distinct [fild] from [table](

شما مطمئنید که منظورتون رو درست نوشتید؟ من فکر می کنم این کد همیشه یک جدول خالی برمیگردونه. دقت کنید که گفتید : اون سطرهایی رو به من بده که فیلدش در لیست بدون تکراری همون فیلد از جدول نباشه. فکر نمی کنم منطقا هیچ گزینه ای پیدا بشه که در این شرط جواب مثبت بدهد.

DotNet_King
دوشنبه 21 مرداد 1387, 00:31 صبح
ممنونم میشه در مورد این دستور بیشتر بگین برا چیه و کجای برنامه اضافه کنم

من فک کنم آقای کفاش بهترین توضیح رو دادند! کتابشون تو همین سایت مجانی قابل دسترسه! دانلود کنید و بخونید و لذت ببرید از قدرت بالا کد نویسی با tsql!!!!!!!!!


موفق باشید.

Dariuosh
دوشنبه 21 مرداد 1387, 01:11 صبح
اگه از Sql Server 2005 استفاده ميکنيد ميتونيد از دستور interest استفاده کنيد


Select * from T1
Intersect
Select * from T2



نتيجه اين دستور اشتراک 2 جدول هست