Arhn - архитектура программирования

Что использовать в SQL вместо цикла Foreach

Я пытаюсь написать хранимую процедуру в SQL, которая будет:

Сделайте запрос на выборку из таблицы 1, который вернет несколько значений. Вставьте новые значения в таблицу 2 (1 новая запись в таблице 2 для каждой записи, возвращаемой выбором в таблице 1).

Я бы использовал foreach в С#, но я знаю, что SQL так не работает. Каков правильный способ сделать это?

Спасибо!

09.07.2009

  • Это дубликат stackoverflow.com/questions/1100852/. Краткий ответ: не зацикливайтесь. Используйте наборы. 09.07.2009
  • Спасибо, в поиске не нашел 09.07.2009

Ответы:


1
INSERT INTO tabl2 (name, id)
   SELECT name, id FROM table1

ИЗМЕНИТЬ

Я должен добавить, что циклы действительно могут быть очень полезными в SQL, так что вы, возможно, захотите узнать, как это сделать. Вот один пример:

DECLARE @temp TABLE (ix int identity(1,1), id int, name varchar(100))

INSERT INTO @temp SELECT id, name FROM table1

DECLARE @i int, @max int

SELECT
   @i = 0
   @max = MAX(ix)
FROM
   @temp

WHILE @i < @max
BEGIN
   SET @i = @i + 1

   -- LOGIC HERE...

END
09.07.2009
  • Хорошо, но не рекомендуется для больших наборов данных. В этом случае было бы предпочтительнее использовать прямой курсор... даже если это делает код уродливым. 10.07.2009

  • 2

    SQL — это язык, основанный на наборах. Что вы делаете, так это выражаете желаемый результат в виде запроса, который возвращает «набор», который затем вставляется в новую таблицу.

    Вы МОЖЕТЕ использовать CURSOR, который основан на строке за строкой, но это действительно последнее средство. Очень-очень редко я обнаруживал, что это единственный путь.

    возможно, если вы опубликуете более подробную информацию о своей проблеме, мы сможем помочь!

    09.07.2009
  • Является ли использование курсоров последним средством, потому что реализация MS SQL медленная, или есть какая-то другая причина? 10.07.2009
  • Нет, потому что, если вы думаете о курсорах на ранней стадии, вы, вероятно, изначально неправильно думаете о проблеме. То, что у вас есть инструмент, не делает его правильным инструментом. 10.07.2009
  • Ганс, курсоры для итерации по записям, как правило, намного медленнее, чем решение на основе набора, особенно в SQl Server. Базы данных оптимизированы для работы в наборах, а не по одной строке за раз, поэтому вам следует рассматривать построчное решение (курсоры, коррелированные подзапросы и т. д.), только если вы не можете найти решение на основе набора, удовлетворяющее потребности. Разница в скорости может не иметь значения для небольших наборов данных, но стремление сначала искать решения на основе наборов улучшит производительность всего приложения. Как только вы привыкнете к ним, решения на основе наборов писать будет легче, чем курсоры. 10.07.2009
  • HLGEM прибил это - как только вы начинаете думать наборами, все действительно становится проще и работает лучше. 10.07.2009

  • 3

    То, что вам нужно, это оператор вставки/выбора, а не для каждого. Если вы обнаружите, что вам нужно перебирать строки, чтобы что-то сделать, вы должны подумать: «Как я могу сделать то же самое в решении на основе наборов». Неспособность мыслить на основе наборов при работе с SQL может очень быстро привести вас к проблемам с производительностью.

    INSERT Table2
           (Col1,
            Col2)
    SELECT T1Col1,
           T1Col2
    FROM   Table1
    WHERE  T1Col2 = 'whatever'
    
    09.07.2009

    4

    Вы можете использовать выбор в качестве значений для вставки

    INSERT INTO Table1
    (
        FieldA,
        FieldB
    )
    SELECT
        FieldA,
        FieldB
    FROM Table2
    
    09.07.2009

    5

    В этом случае не требуется "foreach". В тех редких случаях, которые вы делаете, изучите курсоры и цикл while. Синтаксис настолько неуклюж, что вы автоматически избегаете их, если можете :)

    Для вашей вставки должно быть что-то вроде этого:

    INSERT INTO table2 (name, id)
       SELECT name, id FROM table1
    

    (скопировано для полноты картины)

    09.07.2009
  • да .. иногда курсоры могут быть злыми. вы также можете использовать while для выполнения циклов. msdn.microsoft.com/en-us/library/ms178642 (SQL.90).aspx 09.07.2009
  • Спасибо за ссылку на цикл while. Он понадобится вам для чтения результирующего набора с помощью курсора :) 10.07.2009
  • В некоторых случаях курсоры могут быть быстрее, чем циклы while, а в других случаях циклы while могут быть быстрее, которые вам нужно протестировать в вашей конкретной ситуации. Почти во всех случаях (исключением являются промежуточные итоги) решение на основе наборов быстрее, чем любое из них, часто совсем немного. Я увеличил время с более чем 24 часов до примерно 40 минут и с 40+ минут до 45 секунд, заменив курсор на решение на основе набора. Аналогичные улучшения произошли бы от цикла while до решения на основе набора. 10.07.2009
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..