Особенности работы с временными таблицами

Особенности работы с временными таблицами

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

1. Временная таблица, это обычная таблица, которая удаляется после того как она мне не нужна, и никакого специального синтаксиса для ее создания и удаления не предусмотрено?
Если это так:
2. Как быть если два пользователя одновременно запустят мою процедуру, которая создает эту таблицу. База сама разрулит где чей экземпляр и не смешает мух и котлеты?
Если это не так:
3. Я могу придумать уникальное имя для таблицы, но я запутался с синтаксисом запросов на работу с такой таблицей. А точнее не могу создать запрос, в котором имя таблицы — переменная.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

C# и работа с временными таблицами
Добрый вечер. Недели 2 назад решил изучать c#, начал с .net Недавно возникла следующая проблема.

Создание процедуры с временными таблицами
Подскажите пожалуйста, как из ниже приведенного кода можно создать процедуру чтоб в ней.

Работа с временными таблицами в VB6.0 + MS Access 20*
Добрый день, формучане. Во время реализации проекта по разработке базы данных склада на Visual.

Сообщение от jeckp

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Особенности работы с QTableWidgetItem
Всем доброго времени суток. Недавно стал изучать QT, перешёл с MFC. Вопрос заключается в следующем.

Особенности работы fread
Решаю типовую задачу: считывание заголовка bmp-файла (точечного рисунка). Однако у меня ничего не.

Особенности работы деструктора
Есть вот такой код. Все работает.#include <iostream> #include <iomanip> using namespace std; .

Особенности работы компилятора
Интересует суть работы компилятора. Как обрабатываются выражения, например, Math.PI * 2, . +=.

Источник

Результат запроса во временную таблицу mysql

Форум Приднестровской поддержки CMS XOOPS.

По ссылке вы можете скачать последнюю версию CMS XOOPS. А так же прочитать инструкции по установке XOOPS и модулей

По данным ссылкам можно скачать модули нашей разработки.

Модуль инструкций. Ознакомьтесь с установкой XOOPS. C начальными познаниями по HTML,CSS, JS, PHP и др.

XOOPSДобро пожаловать на сайт поддержки XOOPS.

Приднестровская поддержка XOOPS

Временные таблицы создаются с помощью оператора CREATE TEMPORARY TABLE. Синтаксис оператора ничем не отличается от оператора CREATE TABLE. Заполнить временную таблицу можно обычным способом, но чаще всего временные таблицы заполняют с помощью вложенных запросов. Например, временные таблицы используются для реализации дополнительного поиска в результатах выполнения запроса. Следует помнить, что имя временной таблицы действительно только в течение текущего соединения с сервером. По завершении соединения с сервером временная таблица автоматически удаляется.

В качестве примера создадим таблицу user_table в базе данных tests.
CREATE TABLE `user_table` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

В поле name мы будем хранить фамилию и имя пользователя. Добавим в таблицу несколько записей:
INSERT INTO `user_table` VALUES (NULL, ‘Иванов Сергей’);
INSERT INTO `user_table` VALUES (NULL, ‘Иванов Николай’);
INSERT INTO `user_table` VALUES (NULL, ‘Иванов Иван’);
INSERT INTO `user_table` VALUES (NULL, ‘Петров Александр’);
INSERT INTO `user_table` VALUES (NULL, ‘Петров Николай’);
INSERT INTO `user_table` VALUES (NULL, ‘Иванов Максим’);

А теперь инсценируем ситуацию поиска в найденном с помощью временных таблиц. Предположим, что первоначальный запрос пользователя выводит клиентов с фамилией Иванов:
SELECT `id`, `name` FROM `user_table` WHERE `name` LIKE ‘%Иванов%’;

Читайте также:  Что дает флюорография и когда ее делать

Сохраним результат запроса во временной таблице, а затем выведем клиентов только с именем Николай:
CREATE TEMPORARY TABLE `temp`
SELECT `id`, `name` FROM `user_table` WHERE `name` LIKE ‘%Иванов%’;
SELECT `name` FROM `temp` WHERE `name` LIKE ‘%Николай%’;
/* Выведет: Иванов Николай */

Обратите внимание: при использовании вложенных запросов не нужно определять структуру временной таблицы. По умолчанию структура временной таблицы будет такой же, как и в результирующей таблице. Посмотреть структуру временной таблицы можно с помощью оператора DESCRIBE:
CREATE TEMPORARY TABLE `temp2`
SELECT `id`, `name` FROM `user_table` WHERE `name` LIKE ‘%Иванов%’;
DESCRIBE `temp2`;

Удалить временную таблицу можно следующими способами:
□ с помощью оператора DROP TABLE:
DROP TABLE <Имя временной таблицы>;
□ по завершении соединения с сервером временная таблица будет удалена автоматически.

Источник

Результат запроса во временную таблицу mysql

У меня данные на стороне сервера для подготовки диаграмм подготавливаются по следующей механике SQL-запросов вида:
SELECT t1.col1, t2.col2, t3.col3
FROM
(SELECT cc AS col1
FROM a
WHERE cc=bb) AS t1,
(SELECT cc AS col2
FROM a
WHERE cc=dd) AS t2,
(SELECT cc AS col3
FROM a
WHERE cc=ee) AS t3

Где “a” это таблица с исходными данными, вычисляемая ресурсоёмким SQL-запросом (он может считаться довольно долго, от 10 до 400+ секунд). В данном примере видно что условий несколько, и запрос “a” для каждого из них вычисляется три раза, что является неэффективным (данные в нём всё равно получаются одни и теже).
Предлагается подсчет SQL-запроса “a” считать один раз и сохранять его во временной таблице.
Здесь появляются две проблемы:
1. Очевидное решение известно, есть например в такой реализации:
DECLARE @temp TABLE(
ID INT,
UnitName nvarchar(255)
);
(подготовлена временная таблица, в которую будем сохранять результаты запроса)
INSERT INTO @temp
SELECT UnitID, UnitName FROM dbo.Units WHERE UnitName = N OR UnitName = N
(Положили во временную таблицу ресурсоёмкий запрос)
SELECT (SELECT ID FROM @temp WHERE UnitName = N), (SELECT ID FROM @temp WHERE UnitName = N)
(используем результаты запроса @temp несколько раз, не считая их каждый раз заново)

Однако это красивое решение будет работать в реализации Oracle, и не будет применимо к нашей MySQL базе.
В MySQL операнд DECLARE к сожалению с типом TABLE не работает.
Аналогом ораклового DECLARE @temp TABLE в MySQL является операнд CREATE TEMPORARY TABLE temp.
2. Мои акаунты под которым выполняются все действия в базах данных не имеют права создавать новые таблицы (даже временные), они являются read-only, поэтому возможность сохранять результат SQL-запроса во временную таблицу отсутсвует. Использовать акаунты с полными правами является небезопасной возможностью, и не рекомендуется.

Тоже не работает.

Обычное логическое выражение:

Проблема в том что сама table1 у меня это еще один громоздкий SELECT, который считается очень долго. В данном случае он посчитается два раза (в боевой ситуации 4 раза и больше). Поэтому такое решение мне не подходит, нужно table1 считать один раз. Запоминать table1 у меня некуда, акаунт принципиально является read-only, это значит что CREATE TEMPORARY TABLE я сделать (для того что бы положить туда посчитанный результат table1) не могу. Поэтому я и спрашиваю про множественный WHERE, применимый для одного table1.

Это Вы меня неправильно поняли.
Запрос должен быть один. Все то что я написал — в одной секции WHERE.
(Кстати, в запросе выше UNION применяется к двум запросам с разным набором возвращаемых полей)

Читайте также:  Инструментарий оценивания на уроках английского языка

Источник

Как использовать временные таблицы MySQL

Как использовать временные таблицы MySQL

База данных

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

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

Что такое временная таблица MySQL? Как это работает?

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

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

Особенности временной таблицы MySQL

Временные таблицы MySQL имеют следующие особенности:

  1. Он хранится в памяти. Следовательно, он доступен в сеансе, в котором он был создан.
  2. Только пользователь, который создал таблицу, может получить доступ к таблице и использовать ее. Это означает, что несколько пользователей могут без конфликтов создать временную таблицу с похожими именами.
  3. Две временные таблицы с одинаковыми именами не могут существовать в одном сеансе одного и того же пользователя.
  4. Временная таблица имеет приоритет над основной. Например, если временная таблица содержит имя, аналогичное имени в основной таблице, основная таблица становится неактивной для этого сеанса. Если временная таблица удалена, основная таблица снова становится пригодной для использования. MySQL обычно не рекомендует называть временные таблицы подобными основным таблицам.
  5. Вы можете использовать DROP TABLE, чтобы удалить временную таблицу.

Основное использование

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

ПРИМЕЧАНИЕ. Чтобы создать временную таблицу MySQL, пользователь должен иметь привилегию CREATE TEMPORARY TABLES.

Общий синтаксис создания временной таблицы MySQL следующий:

Создание временной таблицы аналогично созданию обычной таблицы MySQL, за исключением использования ключевого слова TEMPORARY.

Например, чтобы создать временную таблицу, см. Запрос ниже:

CREATE DATABASE temporary;

USE temporary;

CREATE TEMPORARY TABLE users ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR ( 50 ) , email VARCHAR ( 255 ) , PRIMARY KEY ( id ) ) ;

После создания таблицы пользователь может выполнять основные операции с таблицей, включая INSERT, UPDATE, DELETE, SELECT и DROP.

Например, давайте вставим некоторые данные во временную таблицу, созданную выше:

Как создать временную таблицу на основе существующей таблицы

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

Общий синтаксис выполнения такой операции следующий:

Удалить временную таблицу MySQL

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

Например, чтобы удалить пользовательскую таблицу, созданную в приведенных выше примерах, мы используем запрос:

ПРИМЕЧАНИЕ. Если у вас есть временная таблица с тем же именем, что и у основной таблицы, убедитесь, что вы используете ключевое слово TEMPORARY в своем операторе DROP, чтобы избежать случайного удаления таблицы.

Заключение

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

Читайте также:  Конкурс на соискание премии Губернатора Московской области Мы рядом ради перемен

Источник



Форум пользователей MySQL

Привет всем! Опишу свою проблему. И прошу у вас помощи.

У меня данные на стороне сервера для подготовки диаграмм подготавливаются по следующей механике SQL-запросов вида:
SELECT t1.col1, t2.col2, t3.col3
FROM
(SELECT cc AS col1
FROM a
WHERE cc=bb) AS t1,
(SELECT cc AS col2
FROM a
WHERE cc=dd) AS t2,
(SELECT cc AS col3
FROM a
WHERE cc=ee) AS t3

Где “a” это таблица с исходными данными, вычисляемая ресурсоёмким SQL-запросом (он может считаться довольно долго, от 10 до 400+ секунд). В данном примере видно что условий несколько, и запрос “a” для каждого из них вычисляется три раза, что является неэффективным (данные в нём всё равно получаются одни и теже).
Предлагается подсчет SQL-запроса “a” считать один раз и сохранять его во временной таблице.
Здесь появляются две проблемы:
1. Очевидное решение известно, есть например в такой реализации:
DECLARE @temp TABLE(
ID INT,
UnitName nvarchar(255)
);
(подготовлена временная таблица, в которую будем сохранять результаты запроса)
INSERT INTO @temp
SELECT UnitID, UnitName FROM dbo.Units WHERE UnitName = N OR UnitName = N
(Положили во временную таблицу ресурсоёмкий запрос)
SELECT (SELECT ID FROM @temp WHERE UnitName = N), (SELECT ID FROM @temp WHERE UnitName = N)
(используем результаты запроса @temp несколько раз, не считая их каждый раз заново)

Однако это красивое решение будет работать в реализации Oracle, и не будет применимо к нашей MySQL базе.
В MySQL операнд DECLARE к сожалению с типом TABLE не работает.
Аналогом ораклового DECLARE @temp TABLE в MySQL является операнд CREATE TEMPORARY TABLE temp.
2. Мои акаунты под которым выполняются все действия в базах данных не имеют права создавать новые таблицы (даже временные), они являются read-only, поэтому возможность сохранять результат SQL-запроса во временную таблицу отсутсвует. Использовать акаунты с полными правами является небезопасной возможностью, и не рекомендуется.

Подскажите как быть. Очень нужно.

#2 08.06.2012 19:30:56

Re: Сохранение результата SQL запроса во временную таблицу.

Можно решать данную задачу с помощью хранимой процедуры, у которой будут права создателя. Тогда создавать временные таблицы сможет только данная процедура и с безопасностью всё будет в порядке
http://dev.mysql.com/doc/refman/5.5/en/ … edure.html

#3 09.06.2012 13:39:36

Re: Сохранение результата SQL запроса во временную таблицу.

А можно тривиальный рабочий пример привести? Желательно как вы это понимаете. Что бы в процедуре создавалась CREATE TEMPORARY TABLE или CREATE VIEW. В доках процедуре передают DEFINER, который является админским акаунтом, и процедура выполняется с его правами. У меня же есть только рид-онли акаунт, которому запрещено создавать временные тейблы и вьюшки.

#4 09.06.2012 14:03:00

Re: Сохранение результата SQL запроса во временную таблицу.

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

#5 13.06.2012 16:50:36

Re: Сохранение результата SQL запроса во временную таблицу.

Тогда задам следующий вопрос, в продолжении поиска решений моей проблемы.
А есть множественный CASE в MySQL, скорее аналог CASE, но только для WHERE? Множественный WHERE точнее.
мне нужно вывести такую штуку:
SELECT
Week,
COUNT(a) as aaa1,
COUNT(a) as aaa2
FROM
(
.
)
WHERE
b<1 (для расчета aaa1)
b>2 (для расчета aaa2)

Источник