Ms access 在Access中参数化交叉表查询中使用IN语句
我有一个交叉表查询,它查询一组位置并获取它们的测量读数。我以测量读数为轴心,因此我得到一个表,其中每行上都有位置/日期组合的所有测量值。这对于获取所有数据非常有效。它还可以很好地过滤每个字段的一个值。i、 e.Ms access 在Access中参数化交叉表查询中使用IN语句,ms-access,parameters,crosstab,Ms Access,Parameters,Crosstab,我有一个交叉表查询,它查询一组位置并获取它们的测量读数。我以测量读数为轴心,因此我得到一个表,其中每行上都有位置/日期组合的所有测量值。这对于获取所有数据非常有效。它还可以很好地过滤每个字段的一个值。i、 e.其中LocationID=?而MeasureID=?但我真正需要的是像WHERE LocationID IN(?)和MeasureID IN(?)这样的东西WHERE?是一个数组(或任何可以完成任务的东西)。这可能吗 在我的表单上,我使用DAO.QueryDef对象来构建我的记录集。如果可
其中LocationID=?而MeasureID=?
但我真正需要的是像WHERE LocationID IN(?)和MeasureID IN(?)这样的东西
WHERE?是一个数组(或任何可以完成任务的东西)。这可能吗
在我的表单上,我使用DAO.QueryDef对象来构建我的记录集。如果可能的话,我希望避免在VBA中构建整个查询字符串,主要是因为这个特定的查询非常长,我希望它位于视图中,而不是代码模块中。尽管如此,我可以在VBA中构建它,但这并不是理想的解决方案。您可以使用替换
sSQL = "SELECT lots of sql WHERE LocationID IN (qqlocidqq)"
sSQLWithLoc = Replace (sSQL, "qqlocidqq", "1,2,3,4")
Dim qdf As QueryDef
'A query that exists
Set qdf= CurrentDB.QueryDefs("MyJunkQuery")
'Permanently change the sql of that query
qdf.SQL = sSQLWithLoc
再进一步研究一下,您可能适合使用Instr,如下所示:
SELECT Table1.LocationID
FROM Table1
WHERE InStr([@List],[LocationID])>0
这样测试:
PARAMETERS Number_List Text(50);
TRANSFORM Count(Table1.AKey) AS CountOfAKey
SELECT Table1.AText
FROM Table1
WHERE InStr([Number_List],[ANumber])>0
GROUP BY Table1.AText
PIVOT Table1.ANumber;
其中,表1由字段AKey、AText和ANumber组成。Number_List是由参数提供的以逗号分隔的数字列表。Instr检查所提供参数中是否存在表1中的数字
重叠1,2,12存在问题,但创造性地使用逗号可能适合:
WHERE InStr("," & [Number_List] & "," , "," & [ANumber] & ",")>0
当然,分隔符不必是逗号,|通常很有用。您始终可以使用replace
sSQL = "SELECT lots of sql WHERE LocationID IN (qqlocidqq)"
sSQLWithLoc = Replace (sSQL, "qqlocidqq", "1,2,3,4")
Dim qdf As QueryDef
'A query that exists
Set qdf= CurrentDB.QueryDefs("MyJunkQuery")
'Permanently change the sql of that query
qdf.SQL = sSQLWithLoc
再进一步研究一下,您可能适合使用Instr,如下所示:
SELECT Table1.LocationID
FROM Table1
WHERE InStr([@List],[LocationID])>0
这样测试:
PARAMETERS Number_List Text(50);
TRANSFORM Count(Table1.AKey) AS CountOfAKey
SELECT Table1.AText
FROM Table1
WHERE InStr([Number_List],[ANumber])>0
GROUP BY Table1.AText
PIVOT Table1.ANumber;
其中,表1由字段AKey、AText和ANumber组成。Number_List是由参数提供的以逗号分隔的数字列表。Instr检查所提供参数中是否存在表1中的数字
重叠1,2,12存在问题,但创造性地使用逗号可能适合:
WHERE InStr("," & [Number_List] & "," , "," & [ANumber] & ",")>0
当然,分隔符不必是逗号,|通常很有用。我不确定你的意思。你可以将它与记录集一起使用,或者设置查询的sql,或者设置表单的记录源。我已经可以这样做了,但这是我试图避免的。我不希望在VBA中像这样构建sql。我想做的是定义我的查询在
查询中
只传递参数。因此,在我的程序的另一部分中,我将此设置为qdef=CurrentDb.querydfs(“SavedQuery”)
然后我可以qdef.parameters(“Parameter1”)=“SomeValue”
而且我不必在我的UI端编写任何SQL。不,我不相信您可以将列表作为参数。这是从VBA中的现有字符串构建SQL,但是,您可以从现有查询中获取字符串,并在中添加“和locationid”(“和locationid在(…)中的简单附录是什么
困难的是,因为这是一个交叉表查询,WHERE子句需要嵌套在Group BY
和FROM
之间。嗯,但这个操作可能没有那么困难……我不确定你的意思。你可以将它与记录集一起使用,或者设置查询的sql,或者设置表单的记录源。我已经能够做到这一点,但它不太难这是我试图避免的。我不想在VBA中构建这样的SQL。我想做的是在query
中定义我的查询,并只传递参数。因此,在我程序的另一部分中,我有这个设置qdef=CurrentDb.querydfs(“SavedQuery”)
然后我可以qdef.parameters(“parameters 1”)=“SomeValue”
而且我不必在我的UI端编写任何SQL。不,我不相信您可以将列表作为参数。这是从VBA中的现有字符串构建SQL,但是,您可以从现有查询中获取字符串,并在中添加“和locationid”(“和locationid在(…)中的简单附录是什么
困难之处在于,因为这是一个交叉表查询,WHERE子句需要嵌套在Group BY
和FROM
之间。嗯,但这一操作可能没有那么困难。。。