Попробовать бесплатно

Обращение к временной таблице более одного раза в одном и том же запросе в MySQL

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

Рассмотрим следующий фрагмент кода:

 create procedure self_join_proc
 as
 begin
   create table #temp_t1(a int, b int)

   insert into #temp_t1 values(0,0);
   insert into #temp_t1 values(0,1);
   insert into #temp_t1 values(1,1);
   insert into #temp_t1 values(1,2);

   select t1.a, t1.b, t2.a, t2.b from #temp_t1 t1, #temp_t1 t2 where t1.a=t2.b;
 end;

Для этого случая есть следующее решение — создание аналогичной временной таблицы.

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

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

Вы получите следующий результат:

   create PROCEDURE self_join_proc()
   begin
     DROP TEMPORARY TABLE IF EXISTS tt_temp_t1;
     create TEMPORARY table tt_temp_t1
     (
       a INT, 
       b INT
     );

     insert into tt_temp_t1  values(0,0);
     insert into tt_temp_t1  values(0,1);
     insert into tt_temp_t1  values(1,1);
     insert into tt_temp_t1  values(1,2);

     DROP TEMPORARY TABLE IF EXISTS tt_temp_t12;
     CREATE TEMPORARY TABLE tt_temp_t12 select * from tt_temp_t1;
     select t1.a, t1.b, t2.a, t2.b from tt_temp_t1 t1, tt_temp_t12 t2 where t1.a = t2.b;
 end;

Давайте сравним результаты: compare_results

Как видите, процедуры возвращают один и тот же набор результатов.


Если у вас есть другие вопросы, пожалуйста, свяжитесь с нами: support@convertum.ru