SQL - Referência linha atual em uma coluna computada com SELECT
Pergunta
Eu tenho uma tabela que representa os parâmetros de um contrato - incluindo a sua mudança ao longo do tempo através de adendos. O primeiro aditamento é um adendo "especial" que representa os parâmetros quando o contrato foi assinado pela primeira vez.
Aqui está como a tabela deve ser semelhante a:
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 é uma FK para a tabela de projetos cuja chave primária também é chamado ProjectID.
Eu quero DeadlineDate ser um campo calculado, calculado assim:
DeadlineDate COMPUTE BY ((
select first 1 AddMonth(contract.BeginDate, DeadlineMonths)
from addendums contract
where contract.projectid = projectid
order by contract.BeginDate ))
O problema é que, em contract.projectid = projectid
o segundo ProjectID tem a referência a linha atual que está sendo calculado, não a linha atual na instrução SELECT (que é o mesmo que contract.projectid
).
Eu estou usando Firebird. Eu preciso da coluna na tabela e não em uma instrução SELECT por causa de problemas ORM no aplicativo usando o banco de dados.
Solução
Apenas prefixar o campo com o nome da tabela da tabela atual:
DeadlineDate COMPUTED BY ((
select first 1 AddMonth(contract.BeginDate, DeadlineMonths)
from addendums contract
where contract.projectid = projects.projectid
order by contract.BeginDate ))
Outras dicas
Você pode criar uma vista sobre sua consulta e usá-lo na 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