Как обновить несколько строк во временной таблице несколькими значениями из другой таблицы, используя только один общий идентификатор между ними?

#sql-server #tsql #sql-update #temp-tables

#sql-server #tsql #sql-обновление #временные таблицы

Вопрос:

Я пытаюсь согласовать идентификаторы во временной таблице (вверху) из другой таблицы БД (внизу). Поскольку у меня есть только один общий идентификатор для двух, я получаю только верхний результат для всех строк (ReconGlobalRemunerationGrantID) в моей временной таблице. Я стремлюсь получить каждый уникальный идентификатор и обновить свою временную таблицу как таковую.

введите описание изображения здесь

Прямо сейчас мой запрос на обновление прост, и я обновляю, используя идентификатор, общий для 2 таблиц. Есть ли функция или другая команда, которую я могу использовать для получения желаемого результата?

 update tgrg set ReconGlobalRemunerationGrantID = grg.GlobalRemunerationGrantID from @GlobalRemunerationGrant tgrg
join @GlobalRemuneration tgr on tgr.GlobalRemunerationID = tgrg.GlobalRemunerationID
join DataCore..GlobalRemuneration gr on gr.CompanyID = @CompanyID and gr.FiscalYearID = tgr.FiscalYearID and gr.DirectorDetailID = tgr.DirectorDetailID and tgr.GlobalRoleIDCODE = gr.GlobalRoleID
join DataCore..GlobalRemunerationGrant grg on gr.GlobalRemunerationID = grg.GlobalRemunerationID
  

Спасибо.

Комментарии:

1. Для приведенных выше данных, каков ваш ожидаемый / желаемый результат? например, для первой строки в вашей временной таблице, что вы хотите в разведке… поле? А для второй строки?

2. @seanb Желаемый результат для поля recon будет 102895 для первой строки, 102896 для второй строки, 102905 для третьей и так далее. Это значения GlobalRemunerationGrantID из таблицы db, которые соответствуют идентификатору. Спасибо.

3. Было бы полезно просмотреть ваш текущий UPDATE оператор.

Ответ №1:

Исходя из комментария — у вас есть 2 значения для сопоставления, а не только одно? например, как GlobalRemunerationID, так и GlobalRemunerationGrantID?

Вот пример использования таблиц ‘temptable’ и ‘t1’

 UPDATE temptable
SET    ReconGlobalRemunerationGrantID = t1.GlobalRemunerationGrantID
FROM   temptable
       INNER JOIN t1 ON temptable.GlobalRemunerationID = t1.GlobalRemunerationID
                    AND temptable.GlobalRemunerationGrantID = t1.GlobalRemunerationGrantID
  

Обновление ниже

Приведенная ниже версия принимает два набора данных

  • Разбивает их на разделы по GlobalRemunerationID и упорядочивает их по ReconGlobalRemunerationGrantID, чтобы получить «номера строк» (rn)
  • Объединяет их в GlobalRemunerationID и rn, чтобы привести их в порядок

Код ключа приведен ниже (с таблицами, немного отличающимися от вашего полного набора, извините — соответствует набору данных, который вы указали).

 
; WITH tgrg AS
        (SELECT  GlobalRemunerationID, ReconGlobalRemunerationGrantID, 
                 ROW_NUMBER() OVER (PARTITION BY GlobalRemunerationID ORDER BY GlobalRemunerationGrantID) AS rn
            FROM #GlobalRemunerationGrant
        )
    UPDATE  tgrg 
    SET     ReconGlobalRemunerationGrantID = tgr.GlobalRemunerationGrantID 
    FROM    tgrg
            INNER JOIN 
               (SELECT   GlobalRemunerationID, GlobalRemunerationGrantID, 
                         ROW_NUMBER() OVER (PARTITION BY GlobalRemunerationID ORDER BY GlobalRemunerationGrantID) AS rn
                    FROM GlobalRemuneration
                ) AS tgr ON tgrg.GlobalRemunerationID = tgr.GlobalRemunerationID AND tgrg.rn = tgr.rn 
  

Там есть db<>fiddle с полным набором — обратите внимание, что я изменил некоторые идентификаторы, чтобы продемонстрировать, что он не использовал их для сопоставления.

Комментарии:

1. У меня есть только 1 значение для сопоставления, для которого является GlobalRemunerationID . Я не могу использовать GlobalRemunerationGrantID во временной таблице, поскольку он не согласуется с тем, чтобы иметь значение каждый раз. Я надеялся обновить поле Recon из 4 строк во временной таблице 4 уникальными значениями из таблицы db вместо только верхнего результата, который дублируется. Извините за путаницу. Спасибо

2. Вы имеете в виду: для данного GlobalRemunerationID у вас есть равное количество строк во временной таблице в качестве основной таблицы, но другие идентификаторы не совпадают? И что вы хотите сделать, это просто расположить их по порядку, например, с 1-го по 1-й, со 2-го по 2-й, с 3-го по 3-й, с 4-го по 4-й (только в порядке предоставления, а не фактических значений)?

3. Да, это правильно. Для данного GlobalRemID наверняка будет одинаковое количество строк во временной таблице и в основной таблице. Мне нужно поместить фактические значения идентификатора предоставления из основной таблицы в поле recon во временной таблице. Моя текущая инструкция update применяет только первый идентификатор предоставления, найденный в основной таблице, ко всем допустимым строкам во временной таблице.

4. Я обновил решение для создания «номеров строк» (внутри каждого GlobalRemunerationID), затем оно совпадает с этим идентификатором и номерами строк. Таблицы / псевдонимы немного отличаются от ваших — это было сделано для упрощения. Вам нужно будет добавить дополнительные таблицы, чтобы получить полный ответ.

5. Также — если возможно, избегайте использования табличных переменных в SQL Server, используйте временные таблицы (например, используйте CREATE TABLE #temptable вместо DECLARE @temptable TABLE . Переменные таблицы не имеют статистики, поэтому SQL Server предполагает, что они имеют 1 строку — и могут быть очень плохими для производительности, если у вас там много строк.