在连接的子查询中使用别名或仅连接Oracle中的一行
问题描述:
所以我一直试图让查询工作半小时,现在我越来越绝望。问题是,我想加入一个表,我的查询,我在一个子查询中生成。子查询本来应该如下所示:在连接的子查询中使用别名或仅连接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
行,或者认为不同的,更好的解决方案(这很可能会存在)的。
有人可以帮忙吗?
在此先感谢!
答
- 选择当前合同。
- 为没有当前合同的帐户选择最近的合约。
- 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
;
从表中显示的样本数据。 –
你是什么意思,具体是什么? –
显示涉及不同列的一些数据行。 –