Я пытаюсь INSERT INTO
таблицу, используя вход из другой таблицы. Хотя это вполне выполнимо для многих механизмов баз данных, мне всегда кажется, что я не могу вспомнить правильный синтаксис для SQL
механизма времени ( MySQL , Oracle , SQL Server , Informix и DB2 ).
Существует ли синтаксис «серебряной пули», исходящий из стандарта SQL (например, SQL-92 ), который позволил бы мне вставлять значения, не беспокоясь о базовой базе данных?
sql
database
syntax
database-agnostic
ansi-sql-92
Клод Хоул
источник
источник
Ответы:
Пытаться:
Это стандартный ANSI SQL и должен работать на любой СУБД
Это определенно работает для:
источник
Ответ Клода Хоула : должен работать нормально, вы также можете иметь несколько столбцов и другие данные:
Я использовал этот синтаксис только с Access, SQL 2000/2005 / Express, MySQL и PostgreSQL, поэтому они должны быть рассмотрены. Он также должен работать с SQLite3.
источник
Чтобы получить только одно значение в множественном значении
INSERT
из другой таблицы, я сделал следующее в SQLite3:источник
INSERT
является либоVALUES
илиSELECT
заявление, но не оба.INSERT INTO ... VALUES ([expr], [expr], ...)
и один из путей в[expr]
является{{NOT} EXISTS} ([select-stmt])
- к сведению , что paranthesis вокруг оператора выбора необходима ({}
то есть по желанию)Оба ответа, которые я вижу, отлично работают в Informix, и в основном это стандартный SQL. То есть обозначение:
отлично работает с Informix и, как я ожидал, со всеми СУБД. (Когда-то 5 или более лет назад, MySQL не всегда поддерживал такую ситуацию; теперь он имеет достойную поддержку для такого рода стандартного синтаксиса SQL и, AFAIK, будет работать нормально в этой записи.) Список столбцов является необязательным, но указывает целевые столбцы в последовательности, поэтому первый столбец результата SELECT перейдет в первый перечисленный столбец и т. д. При отсутствии списка столбцов первый столбец результата SELECT перейдет в первый столбец целевой таблицы.
Что может отличаться в разных системах, так это нотация, используемая для идентификации таблиц в разных базах данных - стандарт не имеет ничего общего с операциями между базами данных (не говоря уже о базах данных). С Informix вы можете использовать следующие обозначения для идентификации таблицы:
Таким образом, вы можете указать базу данных, опционально идентифицируя сервер, на котором размещена эта база данных, если его нет на текущем сервере, за которым следует необязательный владелец, точка и, наконец, фактическое имя таблицы. Стандарт SQL использует термин схема для того, что Informix называет владельцем. Таким образом, в Informix любая из следующих нотаций может идентифицировать таблицу:
Владелец вообще не должен быть указан; однако, если вы используете кавычки, вам нужно правильно написать имя владельца - оно становится чувствительным к регистру. Это:
все идентифицируют одну и ту же таблицу. С Informix есть небольшое осложнение с базами данных MODE ANSI, где имена владельцев обычно преобразуются в верхний регистр (informix является исключением). То есть в базе данных MODE ANSI (обычно не используется) вы можете написать:
и имя владельца в системном каталоге будет «НЕКОТОРЫЙ», а не «кто-то». Если вы заключаете имя владельца в двойные кавычки, оно действует как идентификатор с разделителями. В стандартном SQL идентификаторы с разделителями могут использоваться во многих местах. В Informix вы можете использовать их только вокруг имен владельцев - в других контекстах Informix обрабатывает как строки в одинарных кавычках, так и строки в двойных кавычках как строки, а не разделяет строки в одинарных кавычках как строки, а строки в двойных кавычках - как идентификаторы с разделителями. (Конечно, просто для полноты есть переменная окружения DELIMIDENT, которую можно установить на любое значение, но Y безопаснее всего - указать, что двойные кавычки всегда окружают идентификаторы с разделителями, а одинарные кавычки всегда окружают строки.)
Обратите внимание, что MS SQL Server удается использовать [идентификаторы с разделителями], заключенные в квадратные скобки. Это выглядит странно для меня, и, конечно, не является частью стандарта SQL.
источник
Чтобы добавить что-то в первый ответ, когда нам нужно всего несколько записей из другой таблицы (в этом примере только одна):
источник
Большинство баз данных придерживаются основного синтаксиса,
Каждая база данных я использовал такой синтаксис , а именно
DB2
,SQL Server
,MY SQL
,PostgresQL
источник
Вместо
VALUES
частиINSERT
запроса просто используйтеSELECT
запрос, как показано ниже.источник
Два подхода для вставки в с помощью подзапроса select.
1. Подход к подзапросу With SELECT, возвращающему результаты в одну строку .
В этом случае предполагается, что подзапрос SELECT возвращает только одну строку результата на основе условия WHERE или агрегатных функций SQL, таких как SUM, MAX, AVG и т. Д. В противном случае он выдаст ошибку
2. Подход к подзапросу With SELECT, возвращающему результаты с несколькими строками .
Второй подход будет работать для обоих случаев.
источник
Это можно сделать без указания столбцов в
INSERT INTO
детали, если вы предоставляете значения для всех столбцов вSELECT
детали.Допустим, таблица 1 имеет два столбца. Этот запрос должен работать:
Это НЕ БУДЕТ работать (значение для
col2
не указано):Я использую MS SQL Server. Я не знаю, как работают другие RDMS.
источник
Это еще один пример использования значений с помощью select:
источник
Простая вставка, когда известна последовательность столбцов таблицы:
Простая вставка с упоминанием колонки:
Массовая вставка, когда количество выбранных столбцов таблицы (# table2) равно таблице вставки (Table1)
Массовая вставка, если вы хотите вставить только в нужный столбец таблицы (таблица1):
источник
Вот еще один пример, где источник взят более чем из одной таблицы:
источник
Просто используйте скобки для предложения SELECT в INSERT. Например, вот так:
источник
Вот как вставить из нескольких таблиц. В этом конкретном примере у вас есть таблица сопоставления в сценарии «многие ко многим»:
(Я понимаю, что сопоставление имени ученика может возвращать более одного значения, но вы понимаете, что сопоставление с чем-то отличным от Id необходимо, когда Id является столбцом Identity и неизвестен.)
источник
Это работает на всех СУБД
источник
Вы можете попробовать это, если хотите вставить все столбцы, используя
SELECT * INTO
таблицу.источник
Я на самом деле предпочитаю следующее в SQL Server 2008:
Это исключает этап добавления набора Insert (), и вы просто выбираете, какие значения идут в таблице.
источник
Это сработало для меня:
Предложение немного отличается от предложения Oracle.
источник
Для Microsoft SQL Server я рекомендую научиться интерпретировать SYNTAX, предоставляемый в MSDN. С Google проще, чем когда-либо, искать синтаксис.
Для этого конкретного случая попробуйте
Первый результат будет http://msdn.microsoft.com/en-us/library/ms174335.aspx
прокрутите вниз до примера («Использование параметров SELECT и EXECUTE для вставки данных из других таблиц»), если вам сложно интерпретировать синтаксис, приведенный в верхней части страницы.
Это должно быть применимо к любой другой СУБД, доступной там. Нет смысла запоминать весь синтаксис для всех продуктов IMO.
источник
источник
Выглядит красиво, но работает, только если tmp не существует (создает его и заполняет). (SQL-сервер)
Чтобы вставить в существующую таблицу tmp:
источник
Лучший способ вставить несколько записей из любых других таблиц.
источник
Если вы идете по маршруту INSERT VALUES для вставки нескольких строк, обязательно разделите VALUES на наборы, используя скобки, поэтому:
В противном случае MySQL возражает, что «Количество столбцов не соответствует количеству значений в строке 1», и в итоге вы пишете тривиальный пост, когда, наконец, выясняете, что с этим делать.
источник
Если вы хотите вставить некоторые данные в таблицу без записи имени столбца.
Где таблицы:
Результат:
источник
В Informix это работает так, как сказал Клод:
источник
Postgres поддерживает следующее: создать таблицу company.monitor2 как select * from company.monitor;
источник