2017-10-17 21 views
0

所以我一直试图让查询工作半小时,现在我越来越绝望。问题是,我想加入一个表,我的查询,我在一个子查询中生成。子查询本来应该如下所示:在连接的子查询中使用别名或仅连接Oracle中的一行

left join (select  ACCN.*, 
         ROW_NUMBER() over (order by 
              case 
               when sysdate between ACCN.BDate and ACCN.EDate then 0 
               else 1 
              end, ACCN.EDate desc) as CNT 
          from  AccountContracts ACCN 
          where  ACCN.AccId = ACC.Id 
          order by case 
             when sysdate between ACCN.BDate and ACCN.EDate then 0 
             else 1 
             end, ACCN.EDate desc) ACN on ACN.CNT = 1 

这里的想法是,当一个帐户可以连接到多个合同,我只是想表明无论是活跃合约(sysdate between ACCN.AcnBDate and ACCN.AcnEDate),或已过期的一个最近。因此,我选择相关的合同,相应地订购它们,最后我只考虑第一个合同。

但是,这不起作用,因为我不能在子查询中引用别名ACC。当然,我可以将where条款移至on条款,但在这种情况下,其他条件将无法产生预期结果。

所以我要么需要能够引用别名在我的子查询,在我on -clause只选择具有最低CNT行,或者认为不同的,更好的解决方案(这很可能会存在)的。

有人可以帮忙吗?

在此先感谢!

+1

从表中显示的样本数据。 –

+0

你是什么意思,具体是什么? –

+0

显示涉及不同列的一些数据行。 –

回答

0
  1. 选择当前合同。
  2. 为没有当前合同的帐户选择最近的合约。
  3. UNION这两个列表。

试试这个:

-- Get all current contracts 
;WITH current_contracts AS (
     SELECT  ACCN.AccId 
        ,ACCN.ContractId -- Replace with relevant column name 
     FROM   AccountContracts ACCN 
     WHERE sysdate BETWEEN ACCN.BDate AND ACCN.EDate 
), 
recent_contracts AS (
     SELECT  ACCN.AccId 
        ,ACCN.ContractId 
     FROM  AccountContracts ACCN 
     WHERE 
     -- Exclude current_contracts 
     NOT EXISTS (
       SELECT 1 
       FROM current_contracts c 
       WHERE ACCN.AccId = c.AccId 
     ) 
     -- Most recent contracts 
     AND ACCN.Edate = (
          SELECT MAX(EDate) 
          FROM AccountContracts m 
          WHERE m.AccId = ACCN.AccId 
          ) 

     UNION 

     SELECT AccId 
       ,ContractId 
     FROM current_contracts 
) 

SELECT Acc.Id, r.AccId, r.ContractId 
FROM leftTable ACC 
LEFT JOIN recent_contracts r 
    ON ACC.Id = r.AccId 

;