如何获取非空查询列表?

时间:2018-09-24 17:39:00

标签: sql ms-access

在MS Access中,我有1个表,每天通过外部文件和50个查询(名为01_query,02_query ... 50_query)进行更新,所有表都具有相同的列和逻辑,但具有不同的筛选器。一些返回结果,其他为空。

如何使用非空查询的名称获取列表(使用另一个查询)?

我找到了使用此代码获取所有查询名称列表的方法

SELECT MSysObjects.Name
FROM MsysObjects
WHERE (Left$([Name],1)<>"~") AND (MSysObjects.Type)=5
ORDER BY MSysObjects.Name

但是我不知道如何过滤掉“空”查询。

2 个答案:

答案 0 :(得分:2)

如果绝对必须具有Access SQL解决方案才能生成列表,请考虑50个数据源中的UNION以外的其他事物。访问不允许您UNION无限数量的数据源,但是我不记得这个限制是什么。即使它允许您UNION 50,我仍然不会这样做。

我在Access 2010中对此进行了测试,并得出了我认为您正在寻找的结果。既然您已经证明自己拥有MsysObjects的阅读权限,那么它也同样适用。

SELECT
    sub.Name
FROM
    (
        SELECT
            m.Name,
            IIf(
                m.Name ALike '[0-9][0-9][_]query' AND m.Type=5,
                DCount('*', m.Name),
                0
               ) AS non_empty_target_query
        FROM MsysObjects AS m
    ) AS sub
WHERE sub.non_empty_target_query=True
ORDER BY sub.Name;

IIf()表达式是此查询的关键字。用类人的话说,如果对象是一个查询,并且其名称以2位数字开头,后跟一个下划线,后跟“ query”,则返回该查询的行数;否则,返回0。否则,请返回零。

然后,父查询过滤掉non_empty_target_query为零(假)的行,仅保留包含“非空”查询名称的行。

答案 1 :(得分:1)

假设所有查询都遵循相同的格式,则实际上您不需要对MSysObjects做任何事情。您可以做一个简单的循环(在VBA中):

Public Sub GetNonEmptyQueries()
   Dim db As DAO.Database, qdf As DAO.QueryDef
   Dim rs As DAO.Recordset
   Dim queryName As String
   Dim i As Integer

   Set db = CurrentDb

   For i = 1 To 50
      queryName = format(i, "00") & "_query"
      Set qdf = db.QueryDefs(format(i, "00") & "_query")
      Set rs = qdf.OpenRecordset

      If rs.recordCount > 0 Then
         ' do whatever you need to do with the query name here
         Debug.Print qdf.Name
      End If
   Next i
End Sub

如果您不想使用VBA,可以编写一个UNION是所有查询中的COUNT(*)的查询。像这样:

SELECT "01_query" AS QueryName,  Count(*) AS [Count] FROM 01_query HAVING COUNT(*) > 0
UNION
SELECT "02_query",  COUNT(*) FROM 02_query HAVING count(*) > 0
...
UNION
SELECT "50_query", COUNT(*) FROM 50_query HAVING COUNT(*) > 0

当然,您将不得不手动添加所有查询,这将变得非常乏味。我认为您花时间手写这样的查询可能会花费更多的时间在VBA上阅读,因此可以使用第一个选项。 :)