Как создать таблицу в sql через запрос
CREATE TABLE AS — создать таблицу из результатов запроса
Синтаксис
CREATE [ [ GLOBAL | LOCAL ] < TEMPORARY | TEMP >| UNLOGGED ] TABLE [ IF NOT EXISTS ]имя_таблицы[ (имя_столбца[, . ] ) ] [ WITH (параметр_хранения[=значение] [, . ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT < PRESERVE ROWS | DELETE ROWS | DROP >] [ TABLESPACEтабл_пространство] ASзапрос[ WITH [ NO ] DATA ]
Описание
CREATE TABLE AS создаёт таблицу и наполняет её данными, полученными в результате выполнения SELECT . Столбцы этой таблицы получают имена и типы данных в соответствии со столбцами результата SELECT (хотя имена столбцов можно переопределить, добавив явно список новых имён столбцов).
CREATE TABLE AS напоминает создание представления, но на самом деле есть значительная разница: эта команда создаёт новую таблицу и выполняет запрос только раз, чтобы наполнить таблицу начальными данными. Последующие изменения в исходных таблицах запроса в новой таблице отражаться не будут. С представлением, напротив, определяющая его команда SELECT выполняется при каждой выборке из него.
Параметры
GLOBAL или LOCAL
Для совместимости игнорируются. Использование этих ключевых слов считается устаревшим; за подробностями обратитесь к CREATE TABLE .
TEMPORARY или TEMP
Если указано, создаваемая таблица будет временной. За подробностями обратитесь к CREATE TABLE . UNLOGGED
Если указано, создаваемая таблица будет нежурналируемой. За подробностями обратитесь к CREATE TABLE . IF NOT EXISTS
Не считать ошибкой, если отношение с таким именем уже существует; просто выдать замечание и оставить таблицу без изменений. имя_таблицы
Имя создаваемой таблицы (возможно, дополненное схемой). имя_столбца
Имя столбца в создаваемой таблице. Если имена столбцов не заданы явно, они определяются по именам столбцов результата запроса. WITH ( параметр_хранения [= значение ] [, . ] )
Это предложение определяет дополнительные параметры хранения для новой таблицы: за подробностями обратитесь к Параметры хранения. Предложение WITH может также включать указание OIDS=TRUE (или просто OIDS ), с которым строкам в новой таблице будут назначаться идентификаторы объектов (OID), либо указание OIDS=FALSE , с которым строки не будут содержать OID. За дополнительными сведениями обратитесь к CREATE TABLE . WITH OIDS
WITHOUT OIDS
Это устаревшее написание указаний WITH (OIDS) и WITH (OIDS=FALSE) , соответственно. Если требуется определить одновременно свойство OIDS и параметры хранения, необходимо использовать синтаксис WITH ( . ) ; см. ниже. ON COMMIT
Поведением временных таблиц в конце блока транзакции позволяет управлять предложение ON COMMIT , которое принимает три параметра:
PRESERVE ROWS
Никакое специальное действие в конце транзакции не выполняется. Это поведение по умолчанию. DELETE ROWS
Все строки в этой временной таблице будут удаляться в конце каждого блока транзакции. По сути, при каждой фиксации транзакции будет автоматически выполняться TRUNCATE . DROP
Эта временная таблица будет удаляться в конце текущего блока транзакции.
TABLESPACE табл_пространство
Здесь табл_пространство — имя табличного пространства, в котором будет создаваться новая таблица. Если оно не указано, выбирается default_tablespace или temp_tablespaces, если таблица временная. запрос
Команда SELECT , TABLE или VALUES , либо команда EXECUTE , выполняющая подготовленный запрос SELECT , TABLE или VALUES . WITH [ NO ] DATA
Это предложение определяет, будут ли данные, выданные запросом, копироваться в новую таблицу. Если нет, то копируется только структура. По умолчанию данные копируются.
Замечания
Функциональность этой команды подобна SELECT INTO , но предпочтительнее использовать её, во избежание путаницы с другими применениями синтаксиса SELECT INTO . Кроме того, набор возможностей CREATE TABLE AS шире, чем у SELECT INTO .
Команда CREATE TABLE AS позволяет пользователю явно определить, добавлять ли OID в таблицу. Если присутствие OID не определено явно, оно определяется конфигурационной переменной default_with_oids.
Примеры
Создание таблицы films_recent , содержащей только последние записи из таблицы films :
CREATE TABLE films_recent AS SELECT * FROM films WHERE date_prod >= '2002-01-01';
Чтобы скопировать таблицу полностью, можно также использовать короткую форму команды TABLE :
CREATE TABLE films2 AS TABLE films;
Создание временной таблицы films_recent , содержащей только последние записи таблицы films , с применением подготовленного оператора. Новая таблица будет содержать OID и прекратит существование при фиксации транзакции:
PREPARE recentfilms(date) AS SELECT * FROM films WHERE date_prod > $1; CREATE TEMP TABLE films_recent WITH (OIDS) ON COMMIT DROP AS EXECUTE recentfilms('2002-01-01');
Совместимость
CREATE TABLE AS соответствует стандарту SQL . Нестандартные расширения перечислены ниже:
Стандарт требует заключать предложение подзапроса в скобки, но в Postgres Pro эти скобки необязательны.
Стандарт требует наличия указания WITH [ NO ] DATA , в Postgres Pro оно необязательно.
Postgres Pro работает с временными таблицами не так, как описано в стандарте; за подробностями обратитесь к CREATE TABLE .
Предложение WITH является расширением Postgres Pro ; в стандарте ни параметры хранения, ни OID не оговариваются.
См. также
| Пред. | Наверх | След. |
| CREATE TABLE | Начало | CREATE TABLESPACE |
Как создать таблицу SQL, столбцы которой — результат запроса SELECT?
Что-нибудь вроде CREATE TABLE NewT (Col1, SELECT DISTINCT Prod From Old_table).
Только чтоб работало, желательно в sqlite.
- Вопрос задан более трёх лет назад
- 5999 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 1
Sql, Oracle, pl/sql, BI, ETL, php, olap
CREATE TABLE NewT AS SELECT DISTINCT Prod From Old_table;
Ответ написан более трёх лет назад
NeoZeed @NeoZeed Автор вопроса
Спасибо за ответ, только не строки, а столбцы!
Думается, что никак. Или через код или перечислить все столбцы в select, а потом делать create table as select
Владимир @azrail_dev
select column_name from user_tab_columns where table_name = ‘НАЗВАНИЕ МОЕЙ ТАБЛИЧКИ’ подставь в запрос выше. В Oracle работает
@azrail_dev @NeoZeed по всей видимости требуется создать таблицу с колонками = уникальным строкам другой таблицы.
select column_name from user_tab_columns where table_name = ‘НАЗВАНИЕ МОЕЙ ТАБЛИЧКИ’ будет аналогично CREATE TABLE NewT AS SELECT * From Old_table; только без данных
Упрощение создания таблиц для записи в них данных из SQL запросов
В одном из фильмов с Уиллом Смитом главный герой в процессе обзвона клиентов заметил, что если он не кладет трубку, а сразу набирает следующий номер, то на один звонок он тратит меньше времени и в день может совершить больше звонков. Таким образом, он сократил время на мелких рутинных делах. Подобное возможно и в других сферах деятельности. Например, если работа связана с выгрузкой или загрузкой данных на SQL Server.
2.2K открытий
При написании больших запросов зачастую требуется записать в «физическую» таблицу результаты соединения нескольких таблиц. Конечно, сделать это можно (или даже нужно) традиционным способом с применением инструкции create TABLE, но для этого необходимо заранее знать все типы данных в столбцах, прописывать их наименования, что занимает определённое время. Более того, в силу человеческого фактора не исключён риск совершения ошибок, которые приведут к лишним трудозатратам на пересоздание таблицы и потере времени при выполнении запроса.
Кто-то скажет: «А как же инструкция select INTO?». Да, эта инструкция позволяет сразу из запроса создать новую таблицу и записать туда результаты запроса выборки, но есть один большой очень критичный недостаток. На больших объёмах данных запросы, содержащие данную инструкцию занимают значительное количество ресурсов на сервере и блокируют работу других пользователей сервера. Обычно такие запросы отключаются администраторами серверов, а в некоторых случаях ещё и блокируются учётные записи пользователей, злоупотребляющих такими выгрузками.
В качестве решения вопроса можно применить следующий вариант. Учитывая, что инструкция select INTO копирует структуру результирующей таблицы, можно применить её к запросу, но не нагружая сервер, выбирать 0 строк (Select top 0 * into и т.д.). После этого, выполнить обычный запрос insert INTO во вновь созданную таблицу. Для того чтобы не делать это каждый раз (ведь главная цель – экономия времени), оформляем всё это в хранимую процедуру с использованием инструкции IF EXIST и данных из системных таблиц.
Таким образом, получаем следующий код:
create procedure [dbo].[sp_ctwsi] (@tablename nvarchar(max), @sql nvarchar(max)) as begin if not exists ( select s.name shm, o.name tbl from sys.objects o inner join sys.schemas s on o.schema_id = s.schema_id where type = ‘u’ and o.name = substring(@tablename, CHARINDEX(‘.’, @tablename)+1, len(@tablename) — CHARINDEX(‘.’, »)+1) and s.name = substring(@tablename, 1, CHARINDEX(‘.’, @tablename)-1) ) begin exec (‘select top 0 * into ‘+@tablename+’ from (‘ + @sql +’) t’ ) end else begin exec (‘insert into ‘+@tablename+’ select * from (‘ + @sql +’) t’ ) end end
Как видно из кода, на входе в процедуру требуется передать два параметра – наименование таблицы со схемой через точку (например, «dbo.MyTable») и SQL-запрос, результаты которого требуется записать в таблицу.
Вот так можно один раз потратить немного времени на написание процедуры и избавиться от мелких, но рутинных задач в дальнейшем. И это только один из вариантов, ведь у каждого программиста наверняка может найтись свой алгоритм оптимизации повседневных задач.
blog.iT-Ti.ru
Показать SQL запрос CREATE TABLE для таблицы в phpmyadmin | MySQL
Для генерации sql запроса создания какой либо таблицы удобно использовать пару способов:
1) Делаем экспорт таблицы в формате SQL , скачиваем, и далее открываем получившийся файлик в текстовом редакторе — в нем содержится необходимый запрос.
2) Просто делаем SQL-запрос (вкладка SQL вверху окна):
SHOW CREATE TABLE `table_name`
Далее, для полного отображения результата, нажимаем по ссылке «версия для печати»
При необходимости получивщийся SQL запрос можно дополнить проверкой на существование одноименной таблицы — в этом случае, можно избежать получения сообщения об ошибки:
CREATE TABLE IF not EXISTS `table_name` ( `id` int .
