Ms access 在Access中参数化交叉表查询中使用IN语句

Ms access 在Access中参数化交叉表查询中使用IN语句,ms-access,parameters,crosstab,Ms Access,Parameters,Crosstab,我有一个交叉表查询,它查询一组位置并获取它们的测量读数。我以测量读数为轴心,因此我得到一个表,其中每行上都有位置/日期组合的所有测量值。这对于获取所有数据非常有效。它还可以很好地过滤每个字段的一个值。i、 e.其中LocationID=?而MeasureID=?但我真正需要的是像WHERE LocationID IN(?)和MeasureID IN(?)这样的东西WHERE?是一个数组(或任何可以完成任务的东西)。这可能吗 在我的表单上,我使用DAO.QueryDef对象来构建我的记录集。如果可

我有一个交叉表查询,它查询一组位置并获取它们的测量读数。我以测量读数为轴心,因此我得到一个表,其中每行上都有位置/日期组合的所有测量值。这对于获取所有数据非常有效。它还可以很好地过滤每个字段的一个值。i、 e.
其中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
之间。嗯,但这一操作可能没有那么困难。。。