Redshift Переменная SELECT INTO — Пример
- Автор сообщения: Витал С
- Последнее изменение сообщения: 13 декабря 2021 г.
- Категория сообщения: Красное смещение
- Время чтения: 4 минуты чтения
Реляционная база данных, поддерживающая процедурный язык, позволяет присваивать значение локальной переменной с помощью оператора SELECT в хранимых процедурах. Такие базы данных, как Teradata, Oracle поддерживают предложение SELECT INTO для присвоения значения локальной переменной. В этой статье мы проверим, как присвоить значение подзапроса локальной переменной, используя предложение Redshift SELECT INTO в хранимых процедурах.
Оператор SELECT
INTO
в Redshift извлекает данные из одной или нескольких таблиц базы данных и присваивает выбранные значения переменным.
Redshift также выбирает строки, определенные любым запросом, и вставляет их в новую таблицу. Вы можете указать, создавать ли временную или постоянную таблицу. Этот синтаксис встроен в синтаксис Microsoft SQL Server T-SQL SELECT INTO.
Redshift SELECT INTO Примеры переменных
Следующая хранимая процедура Redshift использует оператор SELECT INTO для извлечения данных из таблицы «TEST2» и присвоения выбранных значений переменным.
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПРОЦЕДУРУ record_type_example() ЯЗЫК КАК $$ ЗАЯВИТЬ rec_type ЗАПИСЬ; v_1 интервал; НАЧИНАТЬ FOR rec_type IN SELECT col1 FROM public.test2 ПЕТЛЯ выберите col1 в v_1 из паблик.тест2 где col2 = rec_type.col1; КОНЕЦ ПЕТЛИ; КОНЕЦ; $$;
Обратите внимание, что вы можете использовать предложение Redshift SELECT INTO для назначения переменной только внутри хранимой процедуры.
Оператор не поддерживается вне хранимых процедур.Redshift SELECT INTO Новая таблица
Предложение Amazon Redshift SELECT INTO также выбирает строки, возвращаемые любым запросом, и вставляет их в новую таблицу. Вы можете указать, создавать ли временную или постоянную таблицу.
Например, после запроса sВыберите все строки из таблицы EVENT и создайте постоянную таблицу NEWEVENT.
выберите * в новое событие из события;
и в следующем примере выберите результат совокупного запроса во временную таблицу с именем ПРИБЫЛЬ:
выберите имя пользователя, фамилию, сумму (цена-комиссия) в качестве прибыли в прибыль от временной таблицы от продаж, пользователи где sales.sellerid=users.userid сгруппировать по 1, 2 порядок по 3 уб;
Похожие статьи,
- Динамические SQL-запросы Redshift и примеры
- Как создать и использовать переменную курсора Redshift? – Примеры
- Набор результатов возврата хранимой процедуры Redshift — рабочий пример
- Условные операторы Redshift — IF, LOOP, WHILE, FOR, CONTINUE и EXIT
Надеюсь, это поможет 🙂
Теги: Redshift, SQL, хранимая процедура
Оператор SQL SELECT INTO
Оператор SQL SELECT INTO
— это расширение Sybase, которое можно использовать для вставки результатов запроса в таблицу (или переменную, в зависимости от СУБД).
В таких СУБД, как SQL Server и PostgreSQL, оператор SELECT INTO
создает новую таблицу и вставляет в нее полученные строки из запроса.
В MariaDB он вставляет набор результатов в переменную. В Oracle он присваивает выбранные значения переменным или наборам.
MySQL и SQLite вообще не поддерживают оператор SELECT INTO
.
Примеры в этой статье вставляют наборы результатов в таблицу. В MariaDB и Oracle целевую таблицу можно заменить именем переменной (или именем коллекции, если вы используете Oracle).
Базовый пример
Вот базовый пример, демонстрирующий выбор и вставку данных в новую таблицу.
ВЫБЕРИТЕ * INTO Pets2 ОТ домашних животных;
В этом примере создается таблица с именем Pets2
с тем же определением таблицы с именем Pets
и вставка всех данных из Pets
в Pets2
.
Мы можем убедиться в этом, выбрав содержимое обеих таблиц.
ВЫБЕРИТЕ * ИЗ домашних животных; ВЫБЕРИТЕ * ОТ домашних животных2;
Результат:
+---------+-------------+-----------+------- ----+------------+ | Идентификатор домашнего животного | Идентификатор типа питомца | Идентификатор владельца | Имя питомца | Дата рождения | |---------+--------------+-----------+------------+- -----------| | 1 | 2 | 3 | Пушистый | 20.11.2020 | | 2 | 3 | 3 | Получить | 2019-08-16 | | 3 | 2 | 2 | Скретч | 2018-10-01 | | 4 | 3 | 3 | Виляние | 2020-03-15 | | 5 | 1 | 1 | Твитнуть | 2020-11-28 | | 6 | 3 | 4 | Пушистый | 2020-09-17 | | 7 | 3 | 2 | Кора | NULL | | 8 | 2 | 4 | Мяу | NULL | +---------+-------------+-----------+------------+- -----------+ (затронуты 8 рядов) +---------+-------------+-----------+------------+- -----------+ | Идентификатор домашнего животного | Идентификатор типа питомца | Идентификатор владельца | Имя питомца | Дата рождения | |---------+--------------+-----------+------------+- -----------| | 1 | 2 | 3 | Пушистый | 20.11.2020 | | 2 | 3 | 3 | Получить | 2019-08-16 | | 3 | 2 | 2 | Скретч | 2018-10-01 | | 4 | 3 | 3 | Виляние | 2020-03-15 | | 5 | 1 | 1 | Твитнуть | 2020-11-28 | | 6 | 3 | 4 | Пушистый | 2020-09-17 | | 7 | 3 | 2 | Кора | NULL | | 8 | 2 | 4 | Мяу | NULL | +---------+-------------+-----------+------------+- -----------+ (затронуто 8 строк)
Когда таблица уже существует
Если мы попытаемся снова запустить оператор SELECT INTO
, мы получим ошибку из-за того, что таблица уже существует.
ВЫБЕРИТЕ * INTO Pets2 ОТ домашних животных;
Результат:
Сообщение 2714, уровень 16, состояние 6, строка 1 В базе данных уже есть объект с именем «Pets2».
Если вы хотите вставить данные в уже существующую таблицу, используйте оператор INSERT INTO. .. SELECT
. Это добавит данные к любым существующим данным. То есть он добавит в таблицу новые строки, сохраняя при этом существующие строки 9.0019
Фильтрация результатов
Оператор SELECT
может выполнять обычные операции SELECT
, такие как фильтрация результатов с помощью предложения WHERE
.
ВЫБЕРИТЕ * INTO Pets3 ОТ домашних животных ГДЕ Дата рождения < '2020-06-01';
В этом примере я отфильтровываю данные только для тех домашних животных, у которых есть дата рождения (DOB) до 1 июня 2020 года.
Выбор из нескольких таблиц
Вы можете выбрать данные из нескольких таблиц, а затем определение целевой таблицы должно основываться на наборе результатов.
ВЫБОР p.PetId, п.имя питомца, р.ДОБ, pt.PetTypeId, pt.PetType, о.Идентификатор владельца, o.Имя, о.Фамилия, о.Телефон, о.Электронная почта INTO Домашние животныеТипыВладельцы С домашними животными р ВНУТРЕННЕЕ СОЕДИНЕНИЕ PetTypes pt ON p. PetTypeId = pt.PetTypeId ВНУТРЕННЕЕ СОЕДИНЕНИЕ Владельцы o ON p.OwnerId = o.OwnerId;
Здесь мы запрашиваем три таблицы и вставляем результаты в таблицу с именем PetsTypesOwners
.
Обратите внимание, что я перечислил здесь каждый столбец, потому что не хотел включать все столбцы.
В частности, я не хотел дублировать столбцы внешнего ключа/первичного ключа. В моем случае внешние ключи имеют те же имена, что и их аналоги первичного ключа в родительской таблице, и я получил бы сообщение об ошибке из-за дублирования имен столбцов, созданных в целевой таблице.
Вот что я имею в виду.
ВЫБЕРИТЕ * INTO Домашние животныеТипыВладельцы2 С домашними животными р ВНУТРЕННЕЕ СОЕДИНЕНИЕ PetTypes pt ON p.PetTypeId = pt.PetTypeId ВНУТРЕННЕЕ СОЕДИНЕНИЕ Владельцы o ON p.OwnerId = o.OwnerId;
Результат:
Сообщение 2705, уровень 16, состояние 3, строка 1 Имена столбцов в каждой таблице должны быть уникальными. Имя столбца PetTypeId в таблице PetsTypesOwners2 указано более одного раза.
Если ваши внешние ключи используют имена столбцов, отличные от имен первичных ключей, то вы, вероятно, получите целевую таблицу, содержащую ненужные столбцы (один для первичного ключа, один для внешнего ключа, и каждый из них содержит одинаковые значения) .
Если вы действительно хотите включить такие повторяющиеся столбцы, но они имеют одно и то же имя, вы всегда можете использовать псевдонимы, чтобы назначить им другое имя в целевой таблице.
ВЫБОР p.PetId, p.OwnerId КАК PetOwnerId, p.PetTypeId КАК PetPetTypeId, п.имя питомца, р.ДОБ, pt.PetTypeId, pt.PetType, о.Идентификатор владельца, o.Имя, о.Фамилия, о.Телефон, о.Электронная почта INTO Домашние животныеТипыВладельцы3 С домашними животными р ВНУТРЕННЕЕ СОЕДИНЕНИЕ PetTypes pt ON p.PetTypeId = pt.PetTypeId ВНУТРЕННЕЕ СОЕДИНЕНИЕ Владельцы o ON p.OwnerId = o.OwnerId;
В этом случае я использовал псевдонимы столбцов, чтобы переназначить имена двух столбцов на PetOwnerId
и PetPetTypeId
.
SELECT INTO Из представления
При необходимости вы также можете выбрать данные из представления.
ВЫБРАТЬ * INTO PetTypeCount ОТ vPetTypeCount;
Это выбирает данные из представления vPetTypeCount
и вставляет их в новую таблицу с именем PetTypeCount
.
Мы можем проверить это с помощью инструкции SELECT
.
ВЫБЕРИТЕ * ИЗ vPetTypeCount; ВЫБЕРИТЕ * ОТ PetTypeCount;
Результат:
+-----------+---------+ | Тип питомца | Считать | |-----------+----------| | Птица | 1 | | Кот | 3 | | Собака | 4 | +-----------+---------+ (затронуты 3 ряда) +-----------+---------+ | Тип питомца | Считать | |-----------+----------| | Птица | 1 | | Кот | 3 | | Собака | 4 | +-----------+---------+ (затронуты 3 ряда)
Поддержка СУБД
Как уже упоминалось, оператор SELECT INTO
является расширением Sybase и поддерживается не всеми основными СУБД.