SQL — ссылка на текущую строку в вычисляемом столбце с помощью SELECT

StackOverflow https://stackoverflow.com/questions/1466530

  •  13-09-2019
  •  | 
  •  

Вопрос

У меня есть таблица, в которой представлены параметры контракта, включая их изменение с течением времени посредством дополнений.Первое дополнение представляет собой «специальное» дополнение, отражающее параметры при первом подписании контракта.

Вот как должна выглядеть таблица:

ID ProjectID BeginDate   DeadlineMonths DeadlineDate
1  20        20-12-2006  24             <computed= 20-12-2006 + 24 months>
2  23        12-03-2007  12             <computed= 12-03-2007 + 12 months>
3  20        06-09-2007  36             <computed= **20-12-2006** + 36 months>

ProjectID — это FK для таблицы Projects, первичный ключ которой также называется ProjectID.

Я хочу, чтобы DeadlineDate было вычисляемым полем, рассчитанным следующим образом:

DeadlineDate COMPUTE BY ((
    select first 1 AddMonth(contract.BeginDate, DeadlineMonths)
    from addendums contract
    where contract.projectid = projectid
    order by contract.BeginDate ))

Проблема в том, что в contract.projectid = projectid второй ProjectID должен ссылаться на текущую вычисляемую строку, а не на текущую строку в операторе выбора (что аналогично contract.projectid).

Я использую Firebird.Мне нужен столбец в таблице, а НЕ в инструкции SELECT из-за проблем ORM в приложении, использующем базу данных.

Это было полезно?

Решение

Просто добавьте к полю имя текущей таблицы:

DeadlineDate COMPUTED BY ((
select first 1 AddMonth(contract.BeginDate, DeadlineMonths)
from addendums contract
where contract.projectid = projects.projectid
order by contract.BeginDate ))

Другие советы

Можете ли вы создать представление по вашему запросу и использовать его в ORM?

CREATE VIEW v_addendums
AS
SELECT  ID, ProjectID, BeginDate, DeadlineMonths, 
        (
        SELECT  first 1 AddMonth(contract.BeginDate, DeadlineMonths)
        FROM    addendums contract
        WHERE   contract.projectid = a.projectid
        ORDER BY
                contract.BeginDate
        )
FROM    addendums a
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top