2009-12-05 2 views
1

Мы имеем .mdb файл с сотнями таблиц: Lesson1, Lesson2, Lesson3, Lesson4 и т.д. Все таблицы имеют одинаковую структуру:Выберите из сотни таблиц сразу (.mdb)

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. существуют сотни таблиц
+1

Как богатые штаты консолидируют таблицы. Теперь. Любая работа, которую вы проводите с отдельными столами, - это полная трата времени. –

ответ

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 может быть удобным инструментом пакетного обновления), чем сотни таблиц уроков, которые должны иметь одинаковые структуры.

+0

+1 для консолидации таблиц. Подумайте об этом сейчас, вместо того, чтобы тратить время на решение проблемы, которая была бы тривиальной, когда вы это сделали. – blackanchorage

+0

@richardtallent, спасибо! Он работал как магия! – Nuku

0

с помощью SQL Server, я могу, к сожалению, увидеть это сделано только с CURSOR Х- (.

Это должно помочь

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 

OK, а затем, если вы можете использовать макрос/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 
+0

К сожалению, у нас нет sql-сервера. знаете ли вы, может ли это быть выполнено с использованием Ms Access или MySQL? Может ли этот код запускаться на Ms Access? – Nuku

+0

Ваш тег сказал sql-сервер, но я буду искать доступ к MS –

+0

Я надеялся на заявление sql, которое было общим и не хотело сузить. Благодарю. – Nuku

Смежные вопросы