Как выбрать из нескольких таблиц после объединения?

0

Я пытаюсь внутренне объединить несколько таблиц (table_A, table_B и table_C) с table_X. Таблица_X выбирается из другой таблицы (table_Y) с помощью LIKE. Для создания table_X требуется очень много времени. Как мне эффективно выполнить задачу?

В настоящее время я делаю следующий запрос для table_A. И повторите процесс для table_B и Table_C.

SELECT * FROM 
Table_A INNER JOIN
(SELECT ID FROM table_Y where ID LIKE "%keyword%") as table_X
USING (ID)

Так как для создания table_X требуется много времени, я бы хотел выбрать из таблиц_A, table_B и table_C в одном запросе. Как мне это сделать?

Несколько вещей на заметку:

  • Мой ожидаемый результат - три отдельные таблицы, а не одна объединенная таблица.

  • У меня нет разрешения на создание временной таблицы в базе данных.

Теги:

1 ответ

0

Запрос возвращает набор результатов, а не таблицу, и запрос может возвращать только один набор результатов. Вам понадобятся три отдельных запроса, чтобы получить желаемые результаты.

Если вашей основной целью является снижение стоимости подзапроса table_X, вы можете создать временную таблицу для хранения результатов подзапроса table_X, а затем присоединиться к этой таблице для ваших запросов с таблицами table_A, table_B и table_C.

Изменить, что нужно иметь в виду:

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

Предполагая, что у вас есть соответствующие разрешения, вы можете создавать обычные таблицы, которые вы намереваетесь удалить по окончании; но необходимо соблюдать осторожность, потому что такие таблицы, как правило, могут быть видны для всех соединений, и разъединение не "очистит" такие таблицы. Они могут работать лучше и не имеют ограничений для настоящих временных таблиц, но вам нужно взвесить риски и выгоды.


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

очень псевдокод:

query: SELECT ID FROM table_Y WHERE [expensive condition(s)];
code: convert ID values received into a comma separated list
query: SELECT [stuff] FROM Table_A WHERE ID IN ([ID values from expensive query]);
query: SELECT [other_stuff] FROM Table_B WHERE ID IN ([ID values from expensive query]);
query: SELECT [more_stuff] FROM Table_C WHERE ID IN ([ID values from expensive query]);
  • 0
    Спасибо за ответ! У меня нет разрешения на создание временной таблицы. Есть ли другие способы?
  • 0
    Я добавил альтернативу первоначальному ответу

Ещё вопросы

Сообщество Overcoder
Наверх
Меню