Для Liquibase createView есть ли способ сохранить значение подпоиска? - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь создать представление в 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

У меня есть два вопроса:

  1. ЕстьМожно ли избежать избыточного вычисления provider_id (код ниже) три раза?

    SELECT TOP 1 provider_id 
    FROM JOB  
    WHERE JOB.employee_id = employee_id  
    ORDER BY end_date DESC 
    

    Поскольку в ликвидасе нет поддержки переменных, таблиц переменных или CTE, как еще можно это сделать?

  2. Можно ли изменить вышеприведенное, чтобы каждый employee_id был указан в нескольких строках (для каждого provider_id, связанного с этим employee_id)? UNION не будут работать, потому что liquibase не поддерживает циклы или какой-либо вид конструкции for-each, а CROSS JOINS не будет работать, поскольку он будет связывать employee_ids с каждым provider_id независимо от того, связаны они или нет.

1 Ответ

1 голос
/ 31 октября 2019

Извините, раньше я не думал ясно, это можно было решить, просто добавив в конце ВНУТРЕННЕЕ СОЕДИНЕНИЕ:

          INNER JOIN (
            SELECT DISTINCT employee_id, provider_id from JOB
          ) as DT
          ON EMPLOYEE.employee_id = DT.employee_id
...