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

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.