一次从数百个表中选择(.mdb)

时间:2009-12-05 09:15:37

标签: sql ms-access

我们有.mdb文件,包含数百个表:Lesson1,Lesson2,Lesson3,Lesson4等。所有表都具有相同的结构:

Lesson<n>
----------------
slide_id
name
description
status
created_date
created_by
updated_date
updated_by

SQL语句将生成如下结果:

| table_name | slide_id | name                          |
|-----------------------|-------------------------------|
| Lesson1    | 1        | name for slide 1 of lesson 1  |
| Lesson1    | 2        | name for slide 2 of lesson 1  |
| Lesson2    | 1        | name for slide 1 of lesson 2  |
| Lesson2    | 2        | whatever                      |
| Lesson2    | 3        | again whatever                |

所以这里有几点:

    必须包含
  1. 表名
  2. 有数百张表

2 个答案:

答案 0 :(得分:5)

如果表名是已知,您可以创建如下的查询:

 SELECT 'Lesson1' AS table_name, slide_id, name, ... FROM Lesson1
 UNION ALL SELECT 'Lesson2', slide_id, name, ... FROM Lesson2
 UNION ALL SELECT 'Lesson3', slide_id, name, ... FROM Lesson3
 UNION ALL SELECT 'Lesson4', slide_id, name, ... FROM Lesson4
 UNION ALL SELECT 'Lesson5', slide_id, name, ... FROM Lesson5

仅当表的数量不断变化时才需要游标。如果没有,这应该可以解决问题。

提示:要生成初始查询,请在Excel中粘贴表的名称,并在下一个单元格中使用公式来创建该表的“UNION ALL”语句。然后直接复制并粘贴回Access。 (或者使用游标动态创建它,但复制/粘贴和快速​​公式很容易,您可以保存excel文件,以防您需要批量添加表,更改所选列等等。)

显然,最终解决方案应该是在可能的情况下合并表,并在查询时添加一个鉴别器字段。哎呀,如果必须的话,维护数百个查询会更容易,每个查询都会拉出一个课程的行(再次,Excel可以成为一个方便的批量更新工具),而不是数百个必须具有相同结构的课程表。

答案 1 :(得分:0)

使用sql server,遗憾的是我只能用CURSOR X来完成 - (。

这应该有帮助

DECLARE @Name VARCHAR(50)
DECLARE Cur CURSOR FOR
SELECT  name 
FROM    sysobjects 
WHERE   xtype = 'U' 
and     name like 'Lesson%'

OPEN Cur
FETCH NEXT FROM Cur INTO @Name

DECLARE @RetTable TABLE(
        TableName VARCHAR(50),
        slide_id INT,
        name VARCHAR(100)
)

WHILE @@FETCH_STATUS = 0
BEGIN
    INSERT INTO @RetTable EXEC ('SELECT ''' + @Name + ''',slide_id , Name FROM ' + @Name)
    FETCH NEXT FROM Cur INTO @Name
END

CLOSE Cur
DEALLOCATE Cur

SELECT  *
FROm    @RetTable

好的,那么如果你可以使用宏/ vba代码,你可以创建一个名为AllLessons的临时表并运行以下代码。我用带按钮的表格测试了这个。

Private Sub Command0_Click()
Dim iTable As Integer
    For iTable = 0 To CurrentDb.TableDefs.Count - 1
        Dim tableName As String
        tableName = CurrentDb.TableDefs(iTable).Name
        If (Left(tableName, Len("Lesson")) = "Lesson") Then
            CurrentDb.Execute "INSERT INTO AllLessons ([table_name],[slide_id],[name]) SELECT """ & tableName & """, [slide_id],[name] FROM " & tableName
        End If
    Next iTable
End Sub