Выберите из сотен таблиц одновременно (.mdb) - PullRequest
1 голос
/ 05 декабря 2009

У нас есть файл .mdb с сотнями таблиц: урок 1, урок 2, урок 3, урок 4 и т. Д. Все таблицы имеют одинаковую структуру:

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 ]

5 голосов
/ 05 декабря 2009

Если имена таблиц известны , вы можете создать запрос, например:

 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 голосов
/ 05 декабря 2009

Используя сервер sql, я, к сожалению, вижу, что это сделано только с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...