SQL - Référence ligne courante dans une colonne calculée avec SELECT
Question
J'ai une table qui représente les paramètres d'un contrat - y compris leur changement au fil du temps par addendas. Le premier additif est un additif « spécial » représentant les paramètres lorsque le contrat a été signé.
Voilà comment la table devrait ressembler à:
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 est FK à la table des projets dont la clé primaire est également appelé ProjectID.
Je veux DeadlineDate être un champ calculé, calculé comme ceci:
DeadlineDate COMPUTE BY ((
select first 1 AddMonth(contract.BeginDate, DeadlineMonths)
from addendums contract
where contract.projectid = projectid
order by contract.BeginDate ))
Le problème est que, dans la seconde contract.projectid = projectid
ProjectID doit faire référence à la ligne de courant étant calculée, et non la ligne courante dans l'instruction de sélection (qui est le même que contract.projectid
).
J'utilise Firebird. J'ai besoin de la colonne dans la table et non pas dans une instruction SELECT en raison de problèmes ORM dans l'application à l'aide de la base de données.
La solution
préfixe Seul le champ avec le nom de la table de la table en cours:
DeadlineDate COMPUTED BY ((
select first 1 AddMonth(contract.BeginDate, DeadlineMonths)
from addendums contract
where contract.projectid = projects.projectid
order by contract.BeginDate ))
Autres conseils
Pouvez-vous créer une vue sur votre requête et de l'utiliser dans le 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