从adoquery中删除重复项

时间:2013-02-13 11:46:11

标签: delphi delphi-xe2

我有一个adoQuery,并希望用结果填充列表框,但没有重复。

      with Fdeptlayout.ADOQuery2 do
  begin
    sql.Clear;
         sql.BeginUpdate;
         sql.Add('SELECT');
         sql.Add(' *');
         sql.Add('FROM');
         sql.Add(' `MList`');
         sql.Add(' ORDER BY `Basic Name`');
         sql.EndUpdate;

         open;
  end;

  while not fdeptlayout.ADOquery2.EOF do
    fdeptlayout.ListBox1.Items.Add(fdeptlayout.ADOQuery2['Basic Name']);
end;

目前,这会向列表框中添加350个项目,其中包含大量重复项。这太多了。如何更改查询以从结果中删除重复项? :(任何帮助都会很棒!

2 个答案:

答案 0 :(得分:6)

你忘记了“下一步”。

  while not fdeptlayout.ADOquery2.EOF do begin
    fdeptlayout.ListBox1.Items.Add(fdeptlayout.ADOQuery2['Basic Name']);
    fdeptlayout.ADOquery2.Next;
  end;

如果没有下一个,你将获得无限循环。

答案 1 :(得分:4)

更改查询:

     sql.Add('SELECT DISTINCT');
     sql.Add('  `Basic Name`');
     sql.Add('FROM');
     sql.Add(' `MList`');
     sql.Add(' ORDER BY `Basic Name`');

DISTINCT过滤掉重复项,并且只选择您需要的字段,可以节省获取可能需要的大量数据。此外,记录中的其他字段可能不同,导致DISTINCT工作次优。

作为一般规则:请勿在查询中使用*,只选择您实际需要的字段。

[编辑]

并且,根据评论中的约定,在while循环中调用Fdeptlayout.ADOQuery2.Next肯定会阻止您的应用程序锁定。 ; - )