Insert sql примеры: INSERT | SQL | SQL-tutorial.ru
Содержание
sql server — Использование TOP в операторе INSERT INTO
Задавать вопрос
спросил
Изменено
6 лет, 11 месяцев назад
Просмотрено
13 тысяч раз
Я читаю руководство по ключевому слову TOP в T-SQL. Но я не очень понимаю примеры, приведенные в учебнике.
Пример 1:
INSERT TOP n INTO table_name1 (Col1, Col2) ВЫБЕРИТЕ Col3, Col4 FROM имя_таблицы2;
В учебнике упоминается, что TOP здесь на самом деле ничего не дает, поскольку в базе данных нет понятия порядка, что я вроде как понимаю.
И правильно ли считать, что n
строк, выбранных из table_name2 , являются полностью случайными записями?
Пример 2:
В учебнике приведен еще один пример, улучшающий первое утверждение.
ВСТАВИТЬ В table_name1 (Col1, Col2) ВЫБЕРИТЕ ВЕРХ n Col3, Col4 ОТ имя_таблицы2 Заказ по Col1;
Вот это запутанная часть. Включение ключевого слова TOP в оператор SELECT должно дать нам лучший контроль над тем, какие строки выбираются и вставляются с помощью предложения ORDER BY. Поэтому я бы предположил, что предложение ORDER BY является частью оператора SELECT во втором примере. Но Col1 не является частью table_name2 .
Меня это чертовски смутило.
Спасибо за любое понимание.
- sql-сервер
- заказ по
- сверху
0
И правильно ли считать, что n строк, выбранных из
table_name2 — это полностью случайные записи?
Если порядок не указан, он обычно использует поля сортировки и направления из конструкции первичного ключа table_name2
, но это не гарантируется. Как сказал Аарон Бертран
На самом деле не имеет значения, что такое кластеризованный индекс. SQL Server может
по-прежнему возвращать порядок, основанный на каком-то другом индексе, основанном на широком
разнообразие факторов. Создание первичного ключа для некоторого столбца НЕ
гарантия того, что выборки без порядка внезапно вернутся
всегда упорядочены по этому столбцу. Вы могли бы заметить, что большинство
время? Конечно. Но это не то же самое, что гарантия. я никогда не видел
белый медведь на моей улице, но нет силового поля белого медведя, которое
предотвращает это. — Аарон Бертран ♦ 14 сен.0003
Конечно, не помешает добавить пункт вашего порядка, даже если вы хотите, чтобы они возвращались в индексном порядке ПК.
Из учебного примера
ВСТАВИТЬ В table_name1 (Col1, Col2) ВЫБЕРИТЕ ВЕРХ n Col3, Col4 ОТ имя_таблицы2 Заказ по Col1;
Гаааа. Это ужасное кодирование. Это будет упорядочено по Col1 ASC
из table_name2, даже если ваше предложение SELECT
не возвращает явно Col1 из второй таблицы. Это НЕ заказано Col3
2-й таблицы или Col1
1-й таблицы. Документы MS для INSERT INTO
не содержат предложения ORDER BY
— ORDER BY
является частью внутреннего предложения SELECT.
Всегда лучше явно указывать, в какую таблицу вы вставляете и из какой выбираете. Например. это был бы немного лучший пример .
ВСТАВИТЬ В имя_таблицы1 (столбец1, столбец2) ВЫБЕРИТЕ ТОП 3 t2.Col3 ,t2.Col4 ОТ имя_таблицы2 КАК t2 СОРТИРОВАТЬ ПО t2.Col1 ASC, t2.Col3 ASC, t2.Col4 ASC
После этого изменения нет никакой путаницы в отношении того, что означает Col1
(и порядка сортировки). Я бы по-прежнему рекомендовал использовать порядок сортировки Col3
и Col4
, если Col1 не уникален для всех записей в table_name2
, как показано выше. Вы не можете использовать псевдоним для таблицы, в которую вставляются записи (например, имя_таблицы1 AS t1 (t1. Col1, t1.Col2)
, так как это недопустимый синтаксис для существующих версий SQL Server. что вы нашли
2
Если это то, что написано в книге, то это в лучшем случае вводит в заблуждение
По крайней мере, в MSSQL 2012
Вставка (столбец1, столбец2) просто основана на индексе
Первый элемент в выборе входит в столбец1
Тип данных должен быть то же самое
Выбор стоит сам по себе и не знает об именах столбцов во вставке
Пример 1 будет действителен только для просто нужны некоторые данные и все равно
Просто нужны некоторые данные для теста
Это будет допустимо только в том случае, если в table_name2 есть col1
Если это так, то это ужасный пример, поскольку многие люди предполагают, что это означает table_name1.Col1
INSERT INTO table_name1 (Col1, Col2) ВЫБЕРИТЕ ВЕРХ n Col3, Col4 ОТ имя_таблицы2 Заказ по Col1;
Лучшим примером является
INSERT INTO table_name1 (Col1, Col2) SELECT TOP (n) Col3, Col4 ОТ имя_таблицы2 Заказ по Col3;
Предположим, что Col1 является кластеризованным индексом, который вы должны отсортировать по col3, даже если вставите все
Это не конфликт имен
этот порядок равен table_name2
INSERT INTO table_name1 (Col3, Col4) SELECT TOP (n) Col3, Col4 ОТ имя_таблицы2 Заказ по Col3;
Вот ситуация, когда вы можете использовать top без сортировки, но это удаление
Вы бы сделали это, чтобы журнал транзакций не заполнялся
select 1 в то время как (@@rowcount > 0) начинать удалить вершину (10000) из таблицы 1 конец
вставка, которая заполняет журнал транзакций
выберите 1 в то время как (@@rowcount > 0) начинать ВСТАВИТЬ В table_name1 (Col3, Col4) ВЫБЕРИТЕ ВЕРХНИЙ (n) T2. Col3, T2.Col4 ОТ table_name2 T2 ЛЕВОЕ СОЕДИНЕНИЕ table_name1 T1 на T1.Col3 = T2.Col3 ГДЕ T1.Col3 равен нулю Заказ по Col3; конец
0
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.