Я пытаюсь создать представление в SQL Server, используя файл журнала изменений yaml liquiBase, в котором каждая строка выглядит следующим образом:
employee_id | provider_id | days_remaining | employed_dates
, и есть три таблицы
- СОТРУДНИК -employee_id, first_name, last_name
- JOB - job_id, employee_id, start_date, end_date, provider_id
ASSIGNMENT - assignment_id, job_id, employee_id, start_date, end_date, provider_id
employee_id
дано для строки
provider_id
- это provider_id
из job_id
, который имеет самое последнее end_date
для этого employee_id
days_remaining
- количество дней, оставшихся до последнего дня окончания назначения для этого employee_id
для вышеупомянутого provider_id
employed_dates
- объединение всех assignment_id
для этогоemployee_id
для вышеупомянутого provider_id
Мой код пока:
databaseChangeLog:
- changeSet:
id: 100
author: 100
dbms: "mssql"
changes:
- createView:
schemaName: ${schemaName}
viewName: employee_history_view
replaceIfExists: true
selectQuery: >
SELECT EMPLOYEE.employee_id,
(
SELECT TOP 1 provider_id from JOB
where JOB.employee_id = employee_id
order by end_date DESC
) as provider_id,
employee.first_name,
employee.last_name,
DATEDIFF(DAY,
(
SELECT max(ASSIGNMENT.end_Date)
from ASSIGNMENT
where ASSIGNMENT.employee_id = EMPLOYEE.employee_id
and ASSIGNMENT.provider_id = (
SELECT TOP 1 provider_id from JOB
where JOB.employee_id = employee_id
order by end_date DESC
)
and end_date < getDate()
),
getdate() ) as days_remaining,
(
'[' + SUBSTRING (
(
SELECT TOP 100 ', {"start":"'+CONVERT(CHAR(10),ASSIGNMENT.start_date,120)+'","end":"'+CONVERT(CHAR(10),ASSIGNMENT.end_date,120)+'"}'
from ASSIGNMENT
where ASSIGNMENT.employee_id = EMPLOYEE.employee_id
and ASSIGNMENT.provider_id = (
SELECT TOP 1 provider_id from JOB
where JOB.employee_id = EMPLOYEE.employee_id
order by end_date DESC
)
order by program_type DESC
for xml path ('')
), 2, 8000) + ']'
) as employed_dates
FROM ${employeeSchema}.EMPLOYEE
У меня есть два вопроса:
ЕстьМожно ли избежать избыточного вычисления provider_id (код ниже) три раза?
SELECT TOP 1 provider_id
FROM JOB
WHERE JOB.employee_id = employee_id
ORDER BY end_date DESC
Поскольку в ликвидасе нет поддержки переменных, таблиц переменных или CTE, как еще можно это сделать?
Можно ли изменить вышеприведенное, чтобы каждый employee_id был указан в нескольких строках (для каждого provider_id, связанного с этим employee_id)? UNION не будут работать, потому что liquibase не поддерживает циклы или какой-либо вид конструкции for-each, а CROSS JOINS не будет работать, поскольку он будет связывать employee_ids с каждым provider_id независимо от того, связаны они или нет.