Как обновить счетчики по дате в таблице A с помощью счетчиков по дате, возвращенных из объединения таблицы B и таблицы C - PullRequest
1 голос
/ 05 мая 2020

Я могу сделать это с помощью временной таблицы. Можно ли выполнить эти два шага в одном запросе на обновление? Все возможные даты уже существуют в TargetTable (вставки не требуются). Я надеюсь сделать это более эффективным, поскольку он часто запускается, поскольку пакеты данных периодически вливаются в таблицу T2.

Таблица T1: список отдельных дат, вставленных или обновленных в этом пакете

Таблица T2: поле datetime2 (3), за которым следуют несколько полей данных, может быть тысячи для любой конкретной даты

Цель: обновить TargetTable: поле даты, за которым следует поле int для хранения общего количества записей по дате (возможно, только что пришло в T2 или могут быть дополнительные записи, добавленные к существующим записям уже в T2)

select T1.date as TargetDate, count(*) as CountF1 
    into #Temp
    from T1 inner join T2
    on T1.date = cast(T2.DateTime as date)
    group by T1.date

update TargetTable 
    set TargetField1 = CountF1
    from #Temp inner join TargetTable 
    on TargetDate = TargetTable.Date

1 Ответ

1 голос
/ 05 мая 2020

Я согласен с рекомендацией Зохара Пеледа. Используйте «Общее табличное выражение», которое часто сокращается как «CTE». CTE может заменить временную таблицу в вашем сценарии. Вы пишете CTE, используя ключевое слово WITH, и помните, что во многих случаях вам понадобится точка с запятой перед ключевым словом WITH (или в конце предыдущего оператора, если хотите). Тогда решение выглядит следующим образом:

;WITH CTE AS
(
SELECT T1.date AS TargetDate, Count(*) AS CountF1
    FROM T1 INNER JOIN T2
    ON T1.date = Cast(T2.DateTime AS DATE)
    GROUP BY T1.date
)
UPDATE TargetTable
    SET TargetField1 = CTE.CountF1
    FROM CTE INNER JOIN TargetTable
    ON CTE.TargetDate = TargetTable.Date;

Вот дополнительная информация об общих табличных выражениях:

https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql

После этого , то еще одна вещь, от которой вы можете выиграть, - это добавить новый столбец в таблицу T2 с типом данных DATE. Этот новый столбец может иметь значение Cast (T2.DateTime AS DATE). Это может быть даже (постоянный) вычисляемый столбец. Затем добавьте индекс в этот новый столбец. Если затем вы присоединитесь к новому столбцу (вместо присоединения к выражению Cast (...)), он может работать быстрее в зависимости от распределения данных. Единственный способ узнать, работает ли он быстрее, - это попробовать.

...