在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
但是我不知道如何过滤掉“空”查询。
答案 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上阅读,因此可以使用第一个选项。 :)