svfat
@svfat
☺Нужен VPS? Два месяца бесплатно. Смотри профиль☺

Как на SQL писать сложные запросы с вложенными селектами в декларативном стиле?

Я не прошу решить конкретную задачу, а хочу научиться принципу. Есть база (mysql) с очень большими как горизонтально, так и вертикально таблицами. Необходимо формировать различного вида таблицы-отчеты, желательно используя только SQL-запросы в целях ускорения работы.

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

Как это я делаю сейчас, используя императивное программирование:
Обертка на python, листает в цикле огромный список name'ов (который получает SELECT'ом) и использует каждое значение как параметр для stored procedure, которая, в свою очередь, создает для каждой ячейки которую надо вычислить временную таблицу, все они потом вставляются в таблицу результата, то есть происходит что-то типа:
CREATE TEMPORARY TABLE `tmp1` ENGINE=MEMORY AS (SELECT * FROM `input` WHERE `name`="xxx")
...

INSERT INTO `result`
SELECT
    tmp1.id AS id,
    count(tmp2.names) AS count_names,
    max(tmp3.values) AS max_value,
    tmp4.second_max AS second_max,
    ...
FROM tmp1, tmp2, tmp3, tmp4


Предполагаю, что эта схема не оптимальна, да и хочется использовать только чистый SQL, пробовал применить LOOP, но почему-то производительность упала в десятки раз, да и императивное программирование на SQL, на мой взгляд, это ад.

Как вообще писать такие сложные запросы в декларативном стиле, которые разом обрабатывают кучу строк? Гуру SQL, поделитесь.
  • Вопрос задан
  • 2065 просмотров
Решения вопроса 1
Vityarik
@Vityarik
Можно написать 1 большой запрос, используя под запросы

select t1.some_field,

   (select t2.value
    from otherTable t2 
    where  t2.name = t1.name
    order by t2.value
    limit 2, 1) as second_value,

   (select sum(t2.value)
    from otherTable t2 
    where  t2.name = t1.name) as total_value

from table_1 t1
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы