Как уже упоминалось, рассмотрите INSERT...SELECT
и избегайте зацикленного INSERT...VALUES
. Фактически, даже рассмотрите версию ANSI (то есть совместимую со всеми СУБД, поддерживаемыми SQL), чтобы избежать дублирования, используя предложение NOT EXISTS
. Но это будет запускать только одно действие, а не два действия условно.
Ниже можно запустить в любое время , и будут добавлены только уникальные пары date_of_report и расширение , игнорируя совпадения. Обязательно замените date_of_report и my_report_date_column для фактических столбцов, поскольку вы никогда явно не делаете это в агрегированном запросе.
INSERT into daily_call_totals
(date_of_report, -- UPDATE COLUMN
extension,
total_talk_time_seconds,
total_talk_time_minutes,
total_outbound)
SELECT
my_report_date_column, -- UPDATE COLUMN
u.extension
, sum(duration) as total_talk_time_seconds
, round(sum(duration) / 60,2) as total_talk_time_minutes
, sum(case when legtype1 = 1 then 1 else 0 end) as total_outbound
FROM SESSION a
JOIN call_summary b
ON a.notablecallid = b.notablecallid
JOIN system_USERS u
ON u.EXTENSION = CALLINGPARTYNO or u.EXTENSION = FINALLYCALLEDPARTYNO
WHERE NOT EXISTS
(SELECT sub.date_of_report, sub.extension
FROM daily_call_totals sub
WHERE sub.date_of_report = my_report_date_column -- UPDATE COLUMN
AND sub.extension = u.extension)
GROUP BY my_report_date_column, extension, u.user_id -- UPDATE COLUMN
Теперь, если вы хотите выполнить два действия условно: 1) обновить существующие значения ИЛИ 2) вставить новые значения, затем использовать DB2 MERGE
(доступно в некоторых, но не во всех СУБД):
MERGE INTO daily_call_totals AS d
USING
(SELECT
my_report_date_column, -- UPDATE COLUMN
u.extension
, sum(duration) as total_talk_time_seconds
, round(sum(duration) / 60,2) as total_talk_time_minutes
, sum(case when legtype1 = 1 then 1 else 0 end) as total_outbound
FROM SESSION a
JOIN call_summary b
ON a.notablecallid = b.notablecallid
JOIN system_USERS u
ON u.EXTENSION = CALLINGPARTYNO or u.EXTENSION = FINALLYCALLEDPARTYNO
GROUP BY my_report_date_column, extension, u.user_id -- UPDATE COLUMN
) AS q
ON (d.date_of_report = q.my_report_date_column -- UPDATE COLUMN
AND d.extension = q.extension)
WHEN MATCHED THEN
UPDATE SET d.total_talk_time_seconds = q.total_talk_time_seconds,
d.total_talk_time_minutes = q.total_talk_time_minutes,
d.total_outbound = q.total_outbound
WHEN NOT MATCHED THEN
INSERT (date_of_report, -- UPDATE COLUMN
extension,
total_talk_time_seconds,
total_talk_time_minutes,
total_outbound)
VALUES (q.my_report_date_column, -- UPDATE COLUMN
q.extension
q.total_talk_time_seconds
q.total_talk_time_minutes
q.total_outbound);