Вставить все значения таблицы в другую таблицу в SQL


128

Я пытаюсь вставить все значения из одной таблицы в другую. Но оператор вставки принимает значения, но я бы хотел, чтобы он принял выбор * из initial_Table. Это возможно?

Ответы:


262

Оператор вставки на самом деле имеет синтаксис для этого. Намного проще, если вы укажете имена столбцов, а не выбираете «*»:

INSERT INTO new_table (Foo, Bar, Fizz, Buzz)
SELECT Foo, Bar, Fizz, Buzz
FROM initial_table
-- optionally WHERE ...

Я лучше проясню это, потому что по какой-то причине этот пост получил несколько голосов против.

Синтаксис INSERT INTO ... SELECT FROM предназначен для случаев, когда таблица, в которую вы вставляете («new_table» в моем примере выше), уже существует. Как говорили другие, синтаксис SELECT ... INTO предназначен для случаев, когда вы хотите создать новую таблицу как часть команды.

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


3
Wha--? Кто-то хочет оставить мне комментарий, объясняющий, почему этот пост вызывает отрицательные голоса? Я не вижу ничего в вопросе OP, который указывает, что новая таблица должна быть создана как часть запроса.
Мэтт Гамильтон,

Как это обрабатывает нарушения ограничений целостности? Например, если дублируется уникальный, останавливает ли он запрос или просто пропускает эту конкретную запись?
Мартин Дейл Лайнесс

Я считаю, что это вызовет ошибку и откатит транзакцию, что означает, что ничего не будет скопировано. Тем не менее, стоит проверить.
Мэтт Гамильтон,

25

Попробуй это:

INSERT INTO newTable SELECT * FROM initial_Table

2
Не работает при использовании звездочек, когда у нас есть столбец идентичности
Mohsen Tavoosi محسن طاوسی

Для этого сценария с идентификатором сначала добавьте SET IDENTITY_INSERT table_name ON и то же самое с off в конце, чтобы вставить значения идентификаторов.
Хуан,

13

Вы можете вставить с помощью подзапроса следующим образом:

INSERT INTO new_table (columns....)
SELECT columns....
FROM initial_table where column=value



4

Есть более простой способ, при котором вам не нужно вводить код (идеально подходит для тестирования или одноразовых обновлений):

Шаг 1

  • Щелкните правой кнопкой мыши таблицу в проводнике и выберите «Редактировать 100 верхних строк»;

Шаг 2

  • Затем вы можете выбрать нужные строки ( Ctrl + Click или Ctrl + A ) и щелкнуть правой кнопкой мыши и скопировать ( Примечание : если вы хотите добавить условие « где », то щелкните правой кнопкой мыши на сетке -> Панель -> SQL сейчас вы можете отредактировать запрос и добавить условие WHERE, затем снова щелкнуть правой кнопкой мыши -> Выполнить SQL, требуемые строки будут доступны для выбора внизу)

Шаг 3

  • Следуйте шагу 1 для целевой таблицы.

Шаг 4

  • Теперь перейдите к концу сетки, и в последней строке в первом столбце будет звездочка (*) (эта строка предназначена для добавления новой записи). Щелкните по нему, чтобы выбрать всю строку, а затем ВСТАВИТЬ ( Ctrl + V ). В ячейке может быть красная звездочка (что означает, что она не сохранена).

Шаг 5

  • Щелкните любую другую строку, чтобы вызвать оператор вставки (красный астерикс исчезнет)

Примечание - 1 : если столбцы расположены не в правильном порядке, как в целевой таблице, вы всегда можете выполнить шаг 2 и выбрать столбцы в том же порядке, что и в целевой таблице

Примечание - 2 - Если у вас есть столбцы Identity, выполните, SET IDENTITY_INSERT sometableWithIdentity ONа затем выполните указанные выше шаги, а в конце выполнитеSET IDENTITY_INSERT sometableWithIdentity OFF


3

Если вы постоянно переносите много данных, то есть не заполняете временную таблицу, я бы рекомендовал использовать SQL Server Import / Export Data. для сопоставления таблиц с таблицами.

Инструмент импорта / экспорта обычно лучше, чем простой SQL, когда у вас есть преобразования типов и возможное усечение значений в вашем отображении. Как правило, чем сложнее ваше сопоставление, тем более продуктивно вы используете инструмент ETL, такой как службы интеграции (SSIS), вместо прямого SQL.

Инструмент импорта / экспорта на самом деле является мастером SSIS, и вы можете сохранить свою работу как пакет dtsx.


2

Я думаю, это заявление может сделать то, что вы хотите.

INSERT INTO newTableName (SELECT column1, column2, column3 FROM oldTable);

0
 Dim ofd As New OpenFileDialog
                ofd.Filter = "*.mdb|*.MDB"
                ofd.FilterIndex = (2)
                ofd.FileName = "bd1.mdb"
                ofd.Title = "SELECCIONE LA BASE DE DATOS ORIGEN (bd1.mdb)"
                ofd.ShowDialog()
                Dim conexion1 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd.FileName
                Dim conn As New OdbcConnection()
                conn.ConnectionString = conexion1
                conn.Open()



            'EN ESTE CODIGO SOLO SE AGREGAN LOS DATOS'
            Dim ofd2 As New OpenFileDialog
            ofd2.Filter = "*.mdb|*.MDB"
            ofd2.FilterIndex = (2)
            ofd2.FileName = "bd1.mdb"
            ofd2.Title = "SELECCIONE LA BASE DE DATOS DESTINO (bd1.mdb)"
            ofd2.ShowDialog()
            Dim conexion2 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd2.FileName
            Dim conn2 As New OdbcConnection()
            conn2.ConnectionString = conexion2
            Dim cmd2 As New OdbcCommand
            Dim CADENA2 As String

            CADENA2 = "INSERT INTO EXISTENCIA IN '" + ofd2.FileName + "' SELECT * FROM EXISTENCIA IN '" + ofd.FileName + "'"


            cmd2.CommandText = CADENA2
            cmd2.Connection = conn2
            conn2.Open()
            Dim dA2 As New OdbcDataAdapter
            dA2.SelectCommand = cmd2
            Dim midataset2 As New DataSet
            dA2.Fill(midataset2, "EXISTENCIA")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.