我想使用查询来循环遍历结构相似但名称不同的表(即tableJan2011,tableFeb2011,tableMar2011等)。
MS Access和SQL Server中是否有一种方法可以在改变其中的表名时使用相同的查询语句。 (类似于使用参数值)(需要这个来为每个不同月份的表添加不同的输入)
答案 0 :(得分:2)
这是一个糟糕的桌面设计。你应该有一个单表,你有一个列表示月/年。然后,您只需查询此单个表并添加WHERE month ='X'和YEAR ='Y',以将结果限制为您所需的结果。
没有表重新设计的使用UNION和聪明的WHERE子句参数,这将导致行只来自适用的表。
SELECT
..
FROM tableJan2011
where...
UNION
SELECT
..
FROM tableFeb2011
where...
UNION
SELECT
..
FROM tableMar2011
where...
答案 1 :(得分:1)
考虑将年份和月份从表名移出到一个表中的列中。
您可以创建一个包含在运行时使用的查询或表名的表,但您必须能够在模块中编写Access BASIC代码。
这是一个示例,假设您在一个包含要执行的查询名称的表上构建查询:
Set db = CurrentDb
Set rsPTAppend = db.OpenRecordset("qry_PTAppend")
rsPTAppend.MoveFirst
Do Until rsPTAppend.EOF
qryPT = rsPTAppend("PT")
Set qdef = db.QueryDefs(qryPT)
sqlOld = qdef.sql
sqlNew = sqlOld
' manipulate sql
If sqlNew <> sqlOld Then
qdef.sql = sqlNew
End If
db.QueryDefs(rsPTAppend("append")).Execute
If sqlNew <> sqlOld Then
qdef.sql = sqlOld
End If
rsPTAppend.MoveNext
Loop
答案 2 :(得分:1)
首先,听取告诉您使用一张桌子的人。他们知道他们说的是什么。
如果由于一些不明原因(例如继承设计并且不允许更改它)而无法做到这一点,那么你就不得不编写VBA代码了。在Access中,我无法在已保存的QueryDef中替换源表(甚至源列 - 仅限值)。
你需要这样的东西:
Private Function QueryTable (strTableName as String) As DAO.Recordset
Const theQuery as String = "SELECT tbl.* FROM [table] As tbl"
Dim sSql As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
sSql = Replace(theQuery, "[table]", strTableName)
Set db = CurrentDb()
Set rs = db.OpenRecordset(sSql)
Set QueryTable = rs
End Function
请注意,这是简化代码。没有错误处理,我没有释放对象(我通常会这样做,即使它们超出范围),SELECT *
几乎总是一个坏主意。
然后,您可以在需要的地方调用此函数,并传递表格的名称。
答案 3 :(得分:0)
不知道Access中可能的内容,但在SQL Server中,您可以创建一个使用union将所有表放在一起然后根据视图构建查询的视图。
您可以选择另外一种方法来构建查询dynamically。
答案 4 :(得分:0)
在sql server中,您可以将字符串作为sql执行。
http://msdn.microsoft.com/en-us/library/ms175170.aspx
我不知道MS Access中有类似的东西(虽然我的经验有限)。但是,您可以在代码中动态生成sql来完成此任务。也许您可以创建一个函数来获取表后缀和参数,并以这种方式构建所需的SQL。