如何查找重复记录

时间:2022-09-04 06:24:41
数据如下:
A        
B
C
A
D
C
A
以上是一组有重复记录的数据,请问如何用SQL语句这样实现?
如果这一组数据有哪怕是有一条记录重复,返回1,如果没有记录重复,则返回0

15 个解决方案

#1


select count(id) from table_name group by id having count(name)>1

#2


你误会了
我是想这样:
A        
B
C
A
D
C
A
这是一组没有正式提交到表中的数据,但在DBGrid上已经显示出来了(已经执行了query1->POST() 但还没有Query1->ApplyUpdates();)在这一组数据中,如果哪怕有一条已经是重复的记录,那么就返回1,否则,返回0 ,请问用sql语句如何实现?

#3


??不在数据库表中的数据也能够用sql操作?

#4


你将该字段设为唯一索引,然后用TRY CATCH容错处理不更好些吗?在缓存中的数据是不能用SQL的,只能自写代码比较了吧

#5


你应该在post()以前进行比较!

#6


可以在OnColExit事件中判断。
假如你有5个字段:a,b,c,d,e;那么就定义5个String的变量:
String sa,sb,sc,se;
然后这样写:
void __fastcall TForm1::DBGrid1ColExit(TObject *Sender)
{
    int i;
    i=DBGrid1->SelectedIndex;
    switch(i)
    {
        case 0:
           sa=Trim(DBGrid1->SelectedField->Text);
           break;
        case 1:
           sb=Trim(DBGrid1->SelectedField->Text);
           if(sa==sb)
           {
             ShowMessage(sb);
             Abort();
           }
           break;
        case 2:
           sc=Trim(DBGrid1->SelectedField->Text);
           if(sc==sa||sc==sb)
           {
             ShowMessage(sc);
             Abort();
           }
           break;
        case 3:
           sd=Trim(DBGrid1->SelectedField->Text);
           ShowMessage(sa+","+sb+","+sc+","+sd);
           if(sd==sa||sd==sb||sd==sc)
           {
             ShowMessage(sd);
             Abort();
           }
           break;
        case 4:
           se=Trim(DBGrid1->SelectedField->Text);
           if(se==sa||se==sb||se==sc||se==sd)
           {
             ShowMessage(se);
             Abort();
           }
           break;
        case 5:
           sf=Trim(DBGrid1->SelectedField->Text);
           if(sf==sa||sf==sb||sf==sc||sf==sd||sf==se)
           {
               ShowMessage(sf);
               sa="";
               sb="";
               sc="";
               sd="";
               se="";
               sf="";
               Abort();
           }

           break;
    }
}

#7


特别注意!变量必须在:
private: // User declarations
                String sa,sb,sc,sd,se,sf;
定义。不然变量离开程序块时其值会被折构掉。

#8


实际使用中不必加ShowMessage(xx);

#9


tiegerium(/*老唐*/:
你的代码,我原贴了,可是似乎没有什么反应啊
我是想这样:
A        
B
C
A
D
C
A
    在这些数据没有提交到表以前,(存在缓存中)DBGrid上已经显示出来了,也就是说已经执行了query1->POST() 但还没有Query1->ApplyUpdates();如果这些没有正式提交到表中的数据存在重复记录,那么系统给个提示:“有重复记录,数据提交失败” 同时并不执行Query1->ApplyUpdates();,请问如何实现?
附:DBGrid并不单单显示的这些没有正式提交到数据库中的这些数据,同时还显示出了表中的原始数据。

#10


我经过测试,运行得很好。不过对于你的情况,你必须修改一些才可以:你的TDBGrid有多少列?如5列,col0,col1....col4,则变量分别是:String strCol0,strCol1......strCol4.
说明一下,我的代码是这样实现的,如果出现重复,则光标在原处不动,不管数据有没有提交,只要单元格中有字符就可以。

#11


tiegerium(/*老唐*/:
我明白了,原来是点击DBGrid时触发了该事件啊(呵呵,谢谢)
可我想这样:
不点击DBGrid 而是点击一个button按钮,也能出现象你这样的提示,但是仅仅判断DBGrid中最大入库编号的那几条记录(DBGrid中有一个字段叫“入库编号”)请问如何实现?
比如:
MC   RKBH
A     01   
B     01
C     01
A     02
D     02
C     02
A     02
但点击Button按钮时,仅仅判断RKBH 是02(也就是最大入库编号)的那几条记录,请问如何实现? 提示还按你的那样

#12


或者不按照你做的提示,只要DBGrid中最大入库编号有重复的记录,则当点击Btton按钮时会给出一个提示:“数据重复”  如果这样,更好。

#13


等我有空的时候帮你想。

#14


呵呵,麻烦你了
不过我确实很急

#15


应该这样
select id from table_name group by id

#1


select count(id) from table_name group by id having count(name)>1

#2


你误会了
我是想这样:
A        
B
C
A
D
C
A
这是一组没有正式提交到表中的数据,但在DBGrid上已经显示出来了(已经执行了query1->POST() 但还没有Query1->ApplyUpdates();)在这一组数据中,如果哪怕有一条已经是重复的记录,那么就返回1,否则,返回0 ,请问用sql语句如何实现?

#3


??不在数据库表中的数据也能够用sql操作?

#4


你将该字段设为唯一索引,然后用TRY CATCH容错处理不更好些吗?在缓存中的数据是不能用SQL的,只能自写代码比较了吧

#5


你应该在post()以前进行比较!

#6


可以在OnColExit事件中判断。
假如你有5个字段:a,b,c,d,e;那么就定义5个String的变量:
String sa,sb,sc,se;
然后这样写:
void __fastcall TForm1::DBGrid1ColExit(TObject *Sender)
{
    int i;
    i=DBGrid1->SelectedIndex;
    switch(i)
    {
        case 0:
           sa=Trim(DBGrid1->SelectedField->Text);
           break;
        case 1:
           sb=Trim(DBGrid1->SelectedField->Text);
           if(sa==sb)
           {
             ShowMessage(sb);
             Abort();
           }
           break;
        case 2:
           sc=Trim(DBGrid1->SelectedField->Text);
           if(sc==sa||sc==sb)
           {
             ShowMessage(sc);
             Abort();
           }
           break;
        case 3:
           sd=Trim(DBGrid1->SelectedField->Text);
           ShowMessage(sa+","+sb+","+sc+","+sd);
           if(sd==sa||sd==sb||sd==sc)
           {
             ShowMessage(sd);
             Abort();
           }
           break;
        case 4:
           se=Trim(DBGrid1->SelectedField->Text);
           if(se==sa||se==sb||se==sc||se==sd)
           {
             ShowMessage(se);
             Abort();
           }
           break;
        case 5:
           sf=Trim(DBGrid1->SelectedField->Text);
           if(sf==sa||sf==sb||sf==sc||sf==sd||sf==se)
           {
               ShowMessage(sf);
               sa="";
               sb="";
               sc="";
               sd="";
               se="";
               sf="";
               Abort();
           }

           break;
    }
}

#7


特别注意!变量必须在:
private: // User declarations
                String sa,sb,sc,sd,se,sf;
定义。不然变量离开程序块时其值会被折构掉。

#8


实际使用中不必加ShowMessage(xx);

#9


tiegerium(/*老唐*/:
你的代码,我原贴了,可是似乎没有什么反应啊
我是想这样:
A        
B
C
A
D
C
A
    在这些数据没有提交到表以前,(存在缓存中)DBGrid上已经显示出来了,也就是说已经执行了query1->POST() 但还没有Query1->ApplyUpdates();如果这些没有正式提交到表中的数据存在重复记录,那么系统给个提示:“有重复记录,数据提交失败” 同时并不执行Query1->ApplyUpdates();,请问如何实现?
附:DBGrid并不单单显示的这些没有正式提交到数据库中的这些数据,同时还显示出了表中的原始数据。

#10


我经过测试,运行得很好。不过对于你的情况,你必须修改一些才可以:你的TDBGrid有多少列?如5列,col0,col1....col4,则变量分别是:String strCol0,strCol1......strCol4.
说明一下,我的代码是这样实现的,如果出现重复,则光标在原处不动,不管数据有没有提交,只要单元格中有字符就可以。

#11


tiegerium(/*老唐*/:
我明白了,原来是点击DBGrid时触发了该事件啊(呵呵,谢谢)
可我想这样:
不点击DBGrid 而是点击一个button按钮,也能出现象你这样的提示,但是仅仅判断DBGrid中最大入库编号的那几条记录(DBGrid中有一个字段叫“入库编号”)请问如何实现?
比如:
MC   RKBH
A     01   
B     01
C     01
A     02
D     02
C     02
A     02
但点击Button按钮时,仅仅判断RKBH 是02(也就是最大入库编号)的那几条记录,请问如何实现? 提示还按你的那样

#12


或者不按照你做的提示,只要DBGrid中最大入库编号有重复的记录,则当点击Btton按钮时会给出一个提示:“数据重复”  如果这样,更好。

#13


等我有空的时候帮你想。

#14


呵呵,麻烦你了
不过我确实很急

#15


应该这样
select id from table_name group by id