Member 12137026 Ответов: 2

Универсальный запрос для чтения общих данных столбцов из имен таблиц некоторого определенного формата "xyz_****"


У меня есть несколько таблиц в базе данных (пусть база данных называется metadata.mdb, которая является базой данных ms access) с именами таблиц

тип xyz_**** (например, xyz_6121, xyz_3438, xyz_1111,....),
abc_**** (электронная.г abc_1233,abc_4560,abc_1427,...),
pqr_*** * и так далее..

каждая таблица определенного типа, например xyz_**** type, имеет несколько общих столбцов, скажем, таблицы xyz_6121, xyz_3438, xyz_1111,.... имеют столбцы x, y и z как общие. Я хочу написать запрос,который может получить все данные таких столбцов(x, y и z) из определенного типа таблицы, то есть xyz_**** сразу(то есть, если это возможно, не запрашивая отдельную таблицу). Я должен получить эти данные с помощью приложения C#, чтобы записать их в лист excel, но я не могу найти запрос, который может решить эту проблему.

На данный момент мне нужно только знать, существует ли какой-либо общий способ, чтобы мы могли запросить некоторые общие данные столбцов из нескольких таблиц (имеющих имя таблицы(xyz_****), начиная с некоторого известного слова "xyz_" и заканчивая любым случайным числом ("****", где каждый * представляет числовое значение)), нужна помощь в этом. Дайте мне знать, если я не совсем ясно выразился.

Что я уже пробовал:

Я ничего не нашел для какого-либо общего способа, чтобы мы могли запросить некоторые общие данные столбцов из нескольких таблиц (имеющих имя таблицы(xyz_****), начиная с некоторого известного слова "xyz_" и заканчивая любым случайным числом ("****", где каждый * представляет числовое значение)), но я могу сделать индивидуальный запрос для каждой таблицы, проблема в том, что если у нас есть 50 или более таблиц, начинающихся с "xyz_", то как с ними бороться.
мне нужно что-то общее для всех этих типов запросов.
выберите x, y, z из xyz_6121
выберите x, y, z из xyz_3438

2 Ответов

Рейтинг:
5

Maciej Los

Единственный способ добиться этого-использовать VBA!

Прежде всего, вам нужно будет перечислить все таблицы с помощью приведенного ниже запроса:

SELECT MSysObjects.Name AS table_name
FROM MSysObjects AS mso
WHERE ((mso.[Name] Like <>'xyz_*') AND (msoType In (1,4,6)) AND (mso.Flags=0));


или с помощью кода VBA: Перечисление таблиц в базе данных Access[^]- рекомендуется!

Затем вам нужно будет перебирать имена таблиц, чтобы создать такую строку запроса:
If .Fields("TABLE_TYPE") <> "VIEW" AND .Fields("TABLE_NAME") Like "xyz*" Then 
    sQuery = sQuery & vbcr & "SELECT x, y, z FROM " & .Fields("TABLE_NAME") & vbCr & _
         "UNION ALL"
End If


Наконец, вы можете создать Дао.QueryDef или выполнить запрос напрямую из строковой переменной.

Для получения более подробной информации, пожалуйста, смотрите:
Как я могу получить имена таблиц из базы данных MS Access? - переполнение стека[^]
RunSQL против выполнить - Вики открыть - открыть справку и инструкции Майкрософт Офис UtterAccess.com[^]
Советы Microsoft Access: доступ к данным с помощью кода VBA-введение в набор записей DAO[^]
Советы корпорации Майкрософт доступ: Дао программирования, примеры кода [^]
Как работать с набором записей (Dao) в MS Access[^]


Рейтинг:
17

David_Wimbley

Я не думаю, что то, о чем вы просите, возможно. Независимо от того, что вы делаете, в конечном итоге вы получите 50 отдельных запросов, попадающих в базу данных.

Я думаю, что у вас есть эти варианты

1) Вы можете использовать динамический SQL и хранить свои числовые суффиксы в таблице var, зацикливаться на таблице var, чтобы заполнить указанные данные во временную таблицу и запрашивать их из временной таблицы.

Псевдокод для этого будет

INSERT INTO @Tables(tablename) 
SELECT 
    TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'xyz_%';

DECLARE @TablesId INT = (SELECT MIN(Id) FROM @Tables);

WHILE @TablesId IS NOT NULL
BEGIN
   DECLARE @TableName varchar(200) = (SELECT tablename FROM @Tables WHERE Id = @TablesId);
   DECLARE @Sql varchar(500) = 'INSERT INTO #aggregationtable (x,y,z) SELECT x,y,z FROM xyz ' + @TableName;
   
   EXEC sp_executesql @Sql;

END;
--Then you can query from the temp table to get all of your data

SELECT * FROM #aggregationtable


2) Вы можете создать представление, а затем сделать запрос из этого представления. Вы можете использовать временную таблицу для заполнения всех этих данных и запроса из них. Но вы все еще спрашиваете 50 раз.

3) Сделайте объединение всех в вашем запросе, но объединение-это дорогостоящая операция, и это на 50 операторах SELECT, вероятно, будет работать не очень эффективно.

SELECT x,y,z FROM xyz_0001
UNION ALL
SELECT x,y,z FROM xyz_0002
UNION ALL
SELECT x,y,z FROM xyz_0003
UNION ALL
SELECT x,y,z FROM xyz_0004


4) не вариант таблиц через имя таблицы, вместо того, чтобы добавить столбец типа datetime или столбце номер версии таблицы, так что вы не имеют этой проблемы.