使用查询循环遍历结构相似但名称不同的表

时间:2011-03-30 15:41:36

标签: sql sql-server ms-access

我想使用查询来循环遍历结构相似但名称不同的表(即tableJan2011,tableFeb2011,tableMar2011等)。

MS Access和SQL Server中是否有一种方法可以在改变其中的表名时使用相同的查询语句。 (类似于使用参数值)(需要这个来为每个不同月份的表添加不同的输入)

5 个答案:

答案 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。