MyOldAccount Ответов: 1

Реализация внутреннего соединения


ПРОБЛЕМА:

Мне нужно выступать 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 локально

Это ограничивает количество данных, которые должны быть переданы к минимуму.

Альтернативой могут быть хранимые процедуры, которые в основном выполняют одни и те же действия на любом из серверов. Это будет иметь то преимущество, что вам не нужно передавать результаты от промежуточных шагов к вашему клиенту, только конечные результаты. (плюс производительность, вероятно, намного лучше, чем на вашем клиенте)

1 Ответов

Рейтинг:
1

Gerry Schmitz

Вы создаете 2 соединения в своей программе; по одному на каждый сервер.

Запросите один; затем запросите другой, используя результаты первого.

Конечно, это требует мышления, выходящего за рамки "присоединиться ко всем".

SQL-серверы поддерживают "распределенные запросы". Вы можете получить доступ к MySQL через ODBC из SQL Server.

Связанные серверы и распределенные запросы | плохие практики SQL[^]