Создание представления без использования подзапросов в MySQL

Я работаю над проектом, который содержит базу данных MySQL.

Я хочу создать представление, которое делает запросы намного проще. Но у меня проблема. Поскольку таблицы, используемые в представлении, содержат около 100 000 строк, а я объединяю четыре из них, представление должно использовать алгоритм объединения. Но согласно документации MySQL:

MERGE нельзя использовать, если представление содержит одну из следующих конструкций:

  • Агрегатные функции (SUM(), MIN(), MAX(), COUNT() и т. Д.)
  • DISTINCT
  • ГРУППА ПО
  • HAVING
  • ПРЕДЕЛ
  • СОЮЗ или СОЮЗ ВСЕХ
  • Подзапрос в списке выбора
  • Относится только к буквальным значениям (в данном случае нет базовой таблицы)

Итак, как бы я вставил поиск, если что-то уже существует

EXIST( SELECT id FROM table WHERE col > val) AS flag

или последний идентификатор, принадлежащий другому идентификатору

(SELECT id FROM payments WHER contract_id = val ORDER BY id DESC LIMIT 1) AS last_payment_id

в представление, без использования подзапроса? На данный момент я стараюсь этого избежать. В некоторых случаях я мог бы добавить действительный период строк (DATE valid_from, DATE valid_to) так, чтобы все периоды были различны для каждого contract_id, поэтому он уникален и поэтому мне не требуется сортировка или ограничение. Но это действительно ужасно.

Есть ли рекомендуемый способ выполнения таких подзапросов без подзапроса вообще?

Или мне просто нужно обмануть меня такими вещами?

Примечание: подзапросы в предложении FROM также запрещены для всех представлений, так что это тоже не вариант.

Пояснение:

Я ищу способ получить вид с такими же результатами, как

CREATE VIEW viewName
AS
SELECT a.someColumn, 
  EXIST( SELECT a FROM table2 t WHERE t2.date > NOW()) AS flag, 
  (SELECT id FROM table3 ORDER BY id DESC LIMIT 1) AS latest_id
 FROM table1

который использует алгоритм слияния.

1 ответ

Решение

Создайте хранимую функцию с помощью DETERMINISTIC а также READS SQL DATA директивы, которые принимают любые аргументы, необходимые для выполнения подзапроса. Сделайте подзапрос внутри функции и верните результат.

Затем обратитесь к функции внутри представления.

Это может показаться нелогичным, но эта абстракция позволяет объявлять представление с помощью ALGORITHM=MERGEи обработаны соответственно, так что у вас нет проблем с производительностью, связанных с TEMPTABLE,

Другие вопросы по тегам