如何设置ADOQuery来过滤数据以显示在DBGrid中有Brook鳟鱼的所有湖泊?
数据:
Nate Pond - LakeMaps.Lake_Name
Brook trout - Species.Species_Name
Creek chub
Golden shiner
黑池塘
Brook trout
Brown bullhead
Common shiner
普拉西德湖
Lake trout
Smallmouth bass
Yellow perch
MDB数据库
ADoTable1 = LakeMaps MASTER
ADOTable2 =物种明细
关系
LakeMaps Table
LakeMaps.Field[0] = Lake_ID: Autonumber --- ]
LakeMaps.Field[1] = Lake_Name: Text--- |
|Relationship set in the access database
Species Table |
Species.Field[0] = Species_ID: numeric --- ]
Species.Field[1] = Species_Name: text
物种表是LakeMaps是主人的细节
如何设置ADOQuery来过滤数据以显示在DBGrid中有Brook鳟鱼的所有湖泊?
已过滤的数据:
Nate Pond
Brook trout
Creek chub
Golden shiner
黑池塘
Brook trout
Brown bullhead
Common shiner
答案 0 :(得分:1)
您可以设置Filtered = true
,然后使用OnFilterRecord
事件并检查详细数据集是否包含请求的值(可以循环或使用Locate
数据集过程完成)
对于大量数据,这可能会非常慢。在这些情况下,我通常直接在SQL中过滤主记录。像这样:
SELECT * FROM LakeMaps
WHERE Lake_ID in (SELECT Lake_ID
FROM Species INNER JOIN SpeciesLakesRelation
ON (Species.Species_ID = SpeciesLakesRelation.Species_Id)
WHERE SPECIES_NAME = 'Brook Trout')
此SQL返回来自具有“Brook Trout”的Lakes的记录。
SpeciesLakesRelation
是包含LakeMaps和Species之间关系的表。
答案 1 :(得分:0)
查询问题是查询中的文本必须在撇号中。如果ComboBoxSpecies.Text
的值为Brook Trout
,则SQL求值为:
SELECT * FROM LakeMaps WHERE Lake_ID in
(SELECT Lake_ID FROM Species INNER JOIN LakeMaps ON
(Species.Species_ID = LakeMaps.Lake_Id)
WHERE SPECIES_NAME = Brook Trout)
请注意,Brook Trout不在撇号中,因此您会从MsAccess中获得语法错误。
修改强>
正如格里在评论中指出的那样:
QuotedStr
函数添加,而不是双撇号。 使用QuotedStr
的Delphi代码应如下所示:
ADOQuery1.SQL.Add( 'SELECT * FROM LakeMaps WHERE Lake_ID in ' +
'(SELECT Lake_ID FROM Species INNER JOIN LakeMaps ON ' +
'(Species.Species_ID = LakeMaps.Lake_Id) ' +
'WHERE SPECIES_NAME = ' + QuotedStr(ComboBoxSpecies.Text) + ')');
现在,如果ComboBoxSpecies.Text
的值为Brook Trout
,那么此字符串为:
'WHERE SPECIES_NAME = ' + QuotedStr(ComboBoxSpecies.Text) + ')'
评估为:
WHERE SPECIES_NAME = 'Brook Trout')