Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获取非空查询列表?_Sql_Ms Access - Fatal编程技术网

Sql 如何获取非空查询列表?

Sql 如何获取非空查询列表?,sql,ms-access,Sql,Ms Access,在MS Access中,我有一个每天通过外部文件更新的表和50个名为01_query、02_query的查询。。。50_查询,具有相同的列和逻辑,但具有不同的筛选器。有些返回结果,有些则为空 如何使用另一个具有非空查询名称的查询来获取列表 我找到了使用此代码获取所有查询名称列表的方法 SELECT MSysObjects.Name FROM MsysObjects WHERE (Left$([Name],1)<>"~") AND (MSysObjects.Type)=5 ORDER

在MS Access中,我有一个每天通过外部文件更新的表和50个名为01_query、02_query的查询。。。50_查询,具有相同的列和逻辑,但具有不同的筛选器。有些返回结果,有些则为空

如何使用另一个具有非空查询名称的查询来获取列表

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

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

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

假设所有查询都采用相同的格式,实际上不需要对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,可以编写一个联合所有查询的计数*的查询。大概是这样的:

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上,这样你就可以使用第一个选项了: 我在Access 2010中测试了这个,它产生了我认为您正在寻找的结果。既然您已经证明您拥有MsysObjects的阅读权限,那么它也应该适用于您

选择 子项名称 从…起 选择 m、 名字, IIf m、 名称类似于“[0-9][0-9][[u]query”和m.Type=5, 数据计数'*',m.名称, 0 作为非\u空\u目标\u查询 从MsysObjects作为m 作为子 其中sub.non\u empty\u target\u query=True 按子公司名称订购; IIf表达式是此查询的键。在类似人类的语言中,它说,如果对象是一个查询,其名称以2位数字开头,后跟一个下划线,后跟查询,则返回该查询的行数;否则只返回零


然后父查询过滤掉那些非空\u target\u查询为零False的行,只留下包含非空查询名称的行。

列表应该是包含由逗号分隔的查询名称的字符串还是其他内容?只是一个我可以查看的列表、一个表、一个列表、一个弹出框。。。这样做的目的是避免整天打开所有的查询来检查您的问题中的查询是否有内容。。。它是否只返回您描述的50个查询的名称。。。或者还有其他查询的名称与XX_查询模式不匹配,应该忽略。是的,还有其他查询与XX_查询模式不匹配,必须忽略。谢谢你,扎克,我是SQL的新手,完全忽略VBA,所以我接受你的提示,作为我编码发展的下一步:我将尝试理解并应用它。无论如何仅供我参考,没有办法通过简单的SQL查询来实现结果?您可以编写一系列联合查询,但这将是一件乏味的事情。我将更新我的答案,这样您就可以看到它的样子。如果这回答了您的问题,请接受它作为答案。好的,在子集上使用SQL方法,它将按预期工作。感谢Zack提供的两个版本。毫无疑问,VBA版本更强大、更优雅,但如果不掌握VBA,我就更难在代码中添加任何变体,所以现在我将使用SQL方法。泰!刚刚尝试过这个解决方案,绝对完美。正是我想要的。我已经尝试使用IIf函数,但没有成功。现在我要研究它为什么有效;谢谢你,HansUpI补充了一些关于它如何工作的解释。一旦你了解了IIf的工作原理,我希望其余的都有意义。完美,非常感谢。泰