SQL Server: дублировать строки при объединении таблиц и вставке новых данных? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть две таблицы, в одной из которых записываются запрошенные выходные для EmployeeID (tbl.HolidayRequest):

EmployeeID  | HoursRequested |  
------------+----------------+
1           | 8              |     
2           | 16             |     
3           | 8              | 
2           | 8              |
1           | 16             |

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

INSERT INTO [dbo].[HoursTakenPerEmployee]
    SELECT
        [dbo].[LotusEmployees].[EmployeeNo.], 
        SUM(ISNULL([dbo].[HolidayRequestForm].[HoursRequested], 0)) AS HoursTaken
    FROM
        [dbo].[LotusEmployees]
    LEFT JOIN
        [dbo].[HolidayRequestForm] ON [dbo].[LotusEmployees].[EmployeeNo.] = [dbo].[HolidayRequestForm].EmployeeNo.]
    GROUP BY
        [dbo].[LotusEmployees].[EmployeeNo.] 

Результат:

EmployeeID  | Total HoursRequested |  
------------+----------------------+
1           |       24             |     
2           |       24             |     
3           |        8             |      
1           |       24             |      
2           |       24             |
3           |        8             |

Как обновить таблицу tbl.HoursRequestedPerEmployee, когда новая запись вставляется в tbl.HolidayRequest и не имеет дубликатов?

1 Ответ

0 голосов
/ 13 декабря 2018

Просто используйте представление:

CREATE VIEW vw_HoursTakenPerEmployee AS
    SELECT le.[EmployeeNo.], 
           COALESCE(SUM(hrf.[HoursRequested]), 0) AS HoursTaken
    FROM [dbo].[LotusEmployees] le LEFT JOIN
         [dbo].[HolidayRequestForm] hrf
          ON le.[EmployeeNo.] = hrf.EmployeeNo.]
    GROUP BYle.[EmployeeNo.];

Представление будет пересчитывать информацию, когда вам это нужно.

Если вы считаете, что вам нужно сохранить информацию в таблице (скажем, дляиз соображений производительности), либо обновляйте таблицу с помощью триггеров (что отвратительно!).Или обрежьте и воссоздайте таблицу:

TRUNCATE TABLE [dbo].[HoursTakenPerEmployee];

INSERT INTO [dbo].[HoursTakenPerEmployee] . . .
...