Создание представления без использования подзапросов в 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
,