2009-09-23 159 views
1

我有一张表,表示合约的参数 - 包括它们随时间推移而通过附录进行的更改。第一份附录是代表合同首次签署时的参数的“特别”增编。SQL - 使用SELECT计算列中的当前参考行

这里的表应该如何看起来像:

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> 

专案编号是FK的项目表,其主键也被称为专案编号。

我想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第二专案编号必须引用当前行被计算,而不是当前行中的select语句(这与contract.projectid相同)。

我正在使用火鸟。由于在使用数据库的应用程序中发生ORM问题,我需要表中的列而不是SELECT语句中的列。

+0

你怎么知道哪一行是要计算对吗?为什么在你的例子中,你计算行1和行3的值而不是行3的值? – 2009-09-23 14:57:08

+1

由于第1行是ProjectID = 20的项目的第一行,因此它保存了合同启动的日期。第3行的BeginDate是附录签署的日期,但截止日期必须根据合同签署日期计算。 – Alex 2009-09-23 15:03:58

回答

2

只是当前表的表名前缀领域:

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

你能否为你的查询创建一个视图并在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 
+0

是的,这应该是诀窍。谢谢! – Alex 2009-09-23 15:23:02