我有一个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个项目,其中包含大量重复项。这太多了。如何更改查询以从结果中删除重复项? :(任何帮助都会很棒!
答案 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
肯定会阻止您的应用程序锁定。 ; - )