Я занимаюсь разработкой небольшого приложения на C ++ и использую PostgreSQL в качестве внутренней базы данных.Наряду с другими таблицами в моей базе данных есть таблица "projects"
.На основе каждого первичного ключа этой таблицы новая таблица динамически добавляется в мою базу данных.
Пример:
Предположим, что таблица проектов содержит следующие 3 строки:
--------------------------------
| Id |Other Columns Goes here |
--------------------------------
| 1 | |
--------------------------------
| 2 | |
--------------------------------
| 3 | |
--------------------------------
Так что в этом случае у меня также есть следующие три таблицы Table1
, Table2
, Table3
Теперь вы можете заметить, что имена таблиц генерируются добавлением проектов.конец фиксированной строки, т. е. «Table
».Также возможно, что для некоторых проектов таблица не создается.
Пример:
Предположим, что таблица проектов содержит следующие 3 строки:
--------------------------------
| Id |Other Columns Goes here |
--------------------------------
| 1 | |
--------------------------------
| 2 | |
--------------------------------
| 3 | |
--------------------------------
Так что в этом я мог бы найти только следующие две таблицы в моембаза данных: Table1
, Table3
Теперь мне просто нужно получить все действующие проекты.Для этого в настоящее время я использую следующий алгоритм:
//part1
SELECT * FROM Projects Table
get the projects info one by one from the results of above query and store them in new instance of my Custom Class Project
Store the above instance in some contianer e.g Vector say vProjects
//part 2
For each Project p in vProject
if (TableExist(p.Id))
Store p in a new container say vValidatedProjects
Note: The TableExist() method execute the following query:
SELECT COUNT(*) FROM pg_tables WHERE tablename = 'Table"+ p.Id + "'"
Теперь все работает нормально, как и ожидалось, но !!!программа выполняется очень медленно только из-за второй части вышеупомянутого алгоритма, если у нас есть тысяча проектов, метод TableExist () также вызывается тысячу раз, и каждый раз, когда этот метод вызывается, выполняется новый запрос, который замедляет программу :(
На мой взгляд, решение состоит в следующем:
//part1
SELECT * FROM Projects Table
WHERE a table exist angainst projets.Id
get only those projects info for whom a dynamic table exist. From the results of above query and store them in new instance of my Custom Class Project
Store the above instance in some contianer e.g Vector say vProjects.
Теперь таким образом только один запрос выполнил задание для нас, а не N + 1 Запросы (где N - это не количество строк вТаблица проектов) Но я не знаю, как мне написать такой запрос, который возвращает вышеуказанные результаты. Пожалуйста, помогите мне в достижении этого.