我们有.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 |
等
所以这里有几点:
答案 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