Реализация внутреннего соединения
ПРОБЛЕМА:
Мне нужно выступать
INNER JOIN
между 2 SQL-запросами, но этот запрос должен был бы получить доступ к 2 базам данных MySQL, расположенным на их собственных серверах.Небольшой пример может лучше объяснить проблему, с которой я сталкиваюсь:
select * from Table1, -- Table1 is located on server 72.93.200.11 INNER JOIN Table2 -- Table2 is located on server 109.93.1.219 on Table1.Id = Table2.Id;
СООТВЕТСТВУЮЩАЯ ИНФОРМАЦИЯ:
- MFC и ODBC используются для доступа к базе данных
- Я никогда раньше не использовал ODBC или MFC для программирования баз данных
- приложение является устаревшим, поэтому я не могу использовать C++ 11 или новее
- Используется Visual Studio 2008
Если требуется дополнительная информация, пожалуйста, оставьте комментарий.
ВОПРОС:
При использовании m_strFilter[^] со вторым
CRecordset
возможно, вы можете проинструктировать меня, как это сделать (опять же, у меня нет никакого предыдущего опыта работы с MFC и ODBC)?Я также приму решение C++, но помните, что я не могу использовать C++ 11 или более новую версию, так как приложение является устаревшим.
Что я уже пробовал:
Это так пост[^] предложите использование
FEDERATED ENGINE
.Я неохотно использую этот подход, так как он имеет низкую производительность, согласно различным комментариям в этом посте.
Другой вариант-выполнять оба запроса отдельно и фильтровать наборы записей в коде.
Я успешно выполнил отдельные запросы, но
m_strFilter
принимает только фиксированную строку, а не CRecordset
.При написании этого вопроса я пытаюсь понять, как обойти вышеуказанное ограничение.
CHill60
Проблемы с производительностью связаны с большими вставками или чтением таблиц. Если Id индексируется, то у вас не должно быть слишком большой проблемы - см. https://dev.mysql.com/doc/refman/8.0/en/federated-usagenotes.html-да.
Знаете ли вы об ошибке в вашем фрагменте кода? После таблицы 1 не должно быть запятой
Stefan_Lang
Хотя я не могу помочь в точной реализации, я не вижу никаких причин, по которым вы не могли бы использовать C++ - если только другие не должны уметь работать с вашим кодом и по какой-то причине не используют устаревшие компиляторы.
Stefan_Lang
Я не знаком с "федеративными таблицами", но, судя по комментариям SO, лучшим решением было бы разделить это объединение на несколько запросов, подобных этому:
1. Выберите уникальный список идентификаторов из таблицы 1 с первого сервера
2. Выберите * из таблицы 2 (с сервера 2), где находится идентификатор (сначала выберите список результатов)
3. Выберите Id из списка результатов (Шаг 2)
4. Выберите * из таблицы 1, где находится идентификатор (Шаг 3 список результатов)
5. Соедините данные из шагов 2 и 4 локально
Это ограничивает количество данных, которые должны быть переданы к минимуму.
Альтернативой могут быть хранимые процедуры, которые в основном выполняют одни и те же действия на любом из серверов. Это будет иметь то преимущество, что вам не нужно передавать результаты от промежуточных шагов к вашему клиенту, только конечные результаты. (плюс производительность, вероятно, намного лучше, чем на вашем клиенте)