0

我有一个 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 个项目添加到列表框中,很多重复项。这太多了。如何更改查询以从结果中删除重复项?:( 任何帮助都会很棒!

4

2 回答 2

6

您忘记了“下一步”。

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

没有下一个,你会得到一个无限循环。

于 2013-02-13T12:52:06.207 回答
4

更改查询:

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

DISTINCT过滤掉重复项,并且通过仅选择您需要的字段,您可以节省大量不需要的数据。此外,记录中的其他字段可能会有所不同,从而导致 DISTINCT 工作不理想。

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

[编辑]

而且,正如评论中所同意的那样,Fdeptlayout.ADOQuery2.Next在 while 循环中调用肯定会防止您的应用程序锁定。;-)

于 2013-02-13T11:49:51.450 回答