Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Вставить внутрь ... значения ( SELECT ... FROM ... )
Я пытаюсь создать таблицу INSERT INTO , используя входные данные из другой таблицы. Хотя это вполне осуществимо для многих движков баз данных , я всегда стараюсь вспомнить правильный синтаксис для движка SQL дня ( MySQL , Oracle , SQL Server , Informix и DB2 ).
Есть ли в стандарте SQL (например, SQL-92 ) синтаксис серебряной пули, который позволил бы мне вставлять значения, не беспокоясь о базовой базе данных?
@ Shadow_x99 : это должно работать нормально, и вы также можете иметь несколько столбцов и другие данные, а также:
INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT table2.column1, table2.column2, 8, 'some string etc.'
FROM table2
WHERE table2.ID = 7;
Edit: я должен упомянуть, что я использовал этот синтаксис только с Access, SQL 2000/2005/Express, MySQL и PostgreSQL, поэтому они должны быть покрыты. Комментатор отметил, что он будет работать с SQLite3.
Оба ответа, которые я вижу, прекрасно работают в Informix конкретно и в основном являются стандартными SQL. То есть, нотация:
INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;
отлично работает с Informix и, как я ожидаю, со всеми DBMS. (Когда-то, 5 или более лет назад, это такая вещь, которую MySQL не всегда поддерживал; теперь он имеет приличную поддержку для такого стандартного синтаксиса SQL и, AFAIK, он будет работать OK на этой нотации.) Список столбцов является необязательным, но указывает целевые столбцы в последовательности, поэтому первый столбец результата SELECT перейдет в первый столбец списка и т. д. При отсутствии списка столбцов первый столбец результата SELECT переходит в первый столбец целевой таблицы.
Что может отличаться между системами, так это нотация, используемая для идентификации таблиц в разных базах данных - стандарт ничего не говорит об операциях между базами данных (не говоря уже об операциях между DBMS). В случае Informix для идентификации таблицы можно использовать следующую нотацию:
[dbase[@server]:][owner.]table
То есть вы можете указать базу данных, дополнительно указав сервер, на котором размещена эта база данных, если она не находится на текущем сервере, а затем указать необязательного владельца, точку и, наконец, фактическое имя таблицы. Стандарт SQL использует термин схема для того, что Informix называет владельцем. Таким образом, в Informix любая из следующих нотаций может идентифицировать таблицу:
table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table
Владелец в целом не нуждается в кавычках; однако, если вы используете кавычки,вам нужно правильно написать имя владельца - оно становится чувствительным к регистру. То есть:
someone.table
"someone".table
SOMEONE.table
все они идентифицируют одну и ту же таблицу. С Informix есть небольшое осложнение с базами данных MODE ANSI, где имена владельцев обычно преобразуются в верхний регистр (исключение составляет informix). То есть в режиме базы данных ANSI (обычно не используется) можно было бы написать:
CREATE TABLE someone.table ( ... )
и имя владельца в системном каталоге будет "SOMEONE", а не 'someone'. Если вы заключаете имя владельца в двойные кавычки, оно действует как разделенный идентификатор. В стандарте SQL разделенные идентификаторы могут использоваться во многих местах. В случае Informix вы можете использовать их только вокруг имен владельцев - в других контекстах Informix обрабатывает как строки в одинарных, так и в двойных кавычках как строки, а не разделяет строки в одинарных кавычках как строки и строки в двойных кавычках как разделенные идентификаторы. (Конечно, для полноты описания существует переменная окружения DELIMIDENT, которая может быть установлена - в любое значение, но Y безопаснее всего - чтобы указать, что двойные кавычки всегда окружают разделенные идентификаторы, а одиночные кавычки всегда окружают строки.)
Обратите внимание, что MS SQL Server умеет использовать [идентификаторы с разделителями], заключенные в квадратные скобки. Это выглядит странно для меня, и, конечно же, не является частью стандарта SQL.
Это можно сделать без указания столбцов в части INSERT INTO , если вы предоставляете значения для всех столбцов в части SELECT .
Предположим, что Таблица 1 имеет два столбца. Этот запрос должен работать:
INSERT INTO table1
SELECT col1, col2
FROM table2
Это не сработает (значение для col2 не указано):
INSERT INTO table1
SELECT col1
FROM table2
Я использую сервер MS SQL. Я не знаю, как работают другие RDMS.
Простая вставка при известной последовательности столбцов таблицы:
Insert into Table1
values(1,2,...)
Простая колонка, в которой указывается вставки :
Insert into Table1(col2,col4)
values(1,2)
Массовая вставка, когда количество выбранных столбцов таблицы (#table2) равно таблице вставки (Table1)
Insert into Table1 {Column sequence}
Select * -- column sequence should be same.
from #table2
Массовая вставка, когда требуется вставить только в нужный столбец таблицы(табл. 1):
Insert into Table1 (Column1,Column2 ....Desired Column from Table1)
Select Column1,Column2..desired column from #table2
from #table2
Вот еще один пример, где источник берется с использованием более чем одной таблицы:
INSERT INTO cesc_pf_stmt_ext_wrk(
PF_EMP_CODE ,
PF_DEPT_CODE ,
PF_SEC_CODE ,
PF_PROL_NO ,
PF_FM_SEQ ,
PF_SEQ_NO ,
PF_SEP_TAG ,
PF_SOURCE)
SELECT
PFl_EMP_CODE ,
PFl_DEPT_CODE ,
PFl_SEC ,
PFl_PROL_NO ,
PF_FM_SEQ ,
PF_SEQ_NO ,
PFl_SEP_TAG ,
PF_SOURCE
FROM cesc_pf_stmt_ext,
cesc_pfl_emp_master
WHERE pfl_sep_tag LIKE '0'
AND pfl_emp_code=pf_emp_code(+);
COMMIT;
Вот как вставить из нескольких таблиц. В этом конкретном примере у вас есть таблица сопоставления в сценарии много ко многим:
insert into StudentCourseMap (StudentId, CourseId)
SELECT Student.Id, Course.Id FROM Student, Course
WHERE Student.Name = 'Paddy Murphy' AND Course.Name = 'Basket weaving for beginners'
(Я понимаю, что совпадение по имени студента может возвращать больше одного значения, но вы понимаете идею. Сопоставление по чему-то другому, кроме идентификатора, необходимо, когда идентификатор является столбцом идентификатора и неизвестен.)
Для Microsoft SQL Server я рекомендую научиться интерпретировать SYNTAX, предоставленный на MSDN. С Google это проще, чем когда-либо, искать синтаксис.
В данном конкретном случае попробуйте
Google: вставить site:microsoft.com
Первый результат будет http://msdn.microsoft.com/en-us/library/ms174335.aspx
прокрутите вниз до примера ("использование параметров SELECT и EXECUTE для вставки данных из других таблиц"), если вам трудно интерпретировать синтаксис, приведенный в верхней части страницы.
[ WITH <common_table_expression> [ ,...n ] ]
INSERT
{
[ TOP ( expression ) [ PERCENT ] ]
[ INTO ]
{ <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
{
[ ( column_list ) ]
[ <OUTPUT Clause> ]
{ VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ]
| derived_table <<<<------- Look here ------------------------
| execute_statement <<<<------- Look here ------------------------
| <dml_table_source> <<<<------- Look here ------------------------
| DEFAULT VALUES
}
}
}
[;]
Это должно быть применимо к любому другому RDBMS, имеющемуся там. Нет смысла запоминать весь синтаксис для всех продуктов IMO.
На самом деле я предпочитаю следующее в SQL Server 2008:
SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeInt
INTO Table3
FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3
Это исключает шаг добавления набора Insert (), и вы просто выбираете, какие значения идут в таблице.
Просто используйте скобки для SELECT предложения в INSERT. Например вот так :
INSERT INTO Table1 (col1, col2, your_desired_value_from_select_clause, col3)
VALUES (
'col1_value',
'col2_value',
(SELECT col_Table2 FROM Table2 WHERE IdTable2 = 'your_satisfied_value_for_col_Table2_selected'),
'col3_value'
);
select *
into tmp
from orders
select *
into tmp
from orders
Выглядит красиво, но работает только в том случае, если tmp не существует (создает его и заполняет). (SQL север)
Чтобы вставить в существующую таблицу tmp:
set identity_insert tmp on
insert tmp
([OrderID]
,[CustomerID]
,[EmployeeID]
,[OrderDate]
,[RequiredDate]
,[ShippedDate]
,[ShipVia]
,[Freight]
,[ShipName]
,[ShipAddress]
,[ShipCity]
,[ShipRegion]
,[ShipPostalCode]
,[ShipCountry] )
select * from orders
set identity_insert tmp off
Два подхода для вставки в с помощью подзапроса select.
- С подзапросом SELECT, возвращающим результаты с одной строкой .
- С подзапросом SELECT, возвращающим результаты с несколькими строками .
1. Подход с SELECT подзапрос, возвращающий результаты в одну строку .
INSERT INTO <table_name> (<field1>, <field2>, <field3>)
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');
В этом случае предполагается, что подзапрос SELECT возвращает только одну строку результата на основе условия WHERE или агрегатных функций SQL, таких как SUM, MAX, AVG и т. д. В противном случае он выдаст ошибку
2. Подход с SELECT подзапрос, возвращающий результаты с нескольких строк .
INSERT INTO <table_name> (<field1>, <field2>, <field3>)
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;
Второй подход будет работать в обоих случаях.
Если вы идете по маршруту вставки значений, чтобы вставить несколько строк, убедитесь, что VALUES разделен на наборы с помощью круглых скобок, поэтому:
INSERT INTO `receiving_table`
(id,
first_name,
last_name)
VALUES
(1002,'Charles','Babbage'),
(1003,'George', 'Boole'),
(1001,'Donald','Chamberlin'),
(1004,'Alan','Turing'),
(1005,'My','Widenius');
В противном случае MySQL объектов, которые "количество столбцов не соответствует количеству значений в строке 1", и вы в конечном итоге пишете тривиальный пост, когда наконец выясните, что с этим делать.