代码之家  ›  专栏  ›  技术社区  ›  Brad

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

  •  1
  • Brad  · 技术社区  · 13 年前

    我有一个交叉表查询,它查询了一堆位置并获得了它们的测量读数。我以测量读数为中心,这样我就得到了一张表,每行都有位置/日期组合的所有测量值。这样可以很好地获取所有数据。它也适用于每个字段过滤一个值。即。 WHERE LocationID = ? AND MeasureID = ? 但我真正需要的是 WHERE LocationID IN (?) AND MeasureID IN (?) 哪里是一个数组(或任何能完成任务的东西。这可能吗?)?

    在我的表单上,我使用DAO.QueryDef对象来构建我的记录集。如果可能的话,我希望避免在VBA中构建整个查询字符串,主要是因为这个特定的查询很长,我宁愿它位于视图中,而不是代码模块中。话虽如此,我 可以 全部用VBA构建,但这不是所需的解决方案。

    1 回复  |  直到 13 年前
        1
  •  1
  •   Brad    13 年前

    您可以随时使用替换。

    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中的ANumber。

    重叠1,2,12存在问题,但创造性地使用逗号可能适合:

    WHERE InStr("," & [Number_List] & "," , "," & [ANumber] & ",")>0
    

    当然,分隔符不必是逗号,|通常很有用。

    推荐文章