我正在尝试编写一个在左连接中使用子查询的查询

问题描述 投票:0回答:1

我想按年份查找各组产品的总成本;并且,我想排除历史金额。我有三张桌子。 风险

Risks_RiskID
Risks_Change_Number
Risks_RiskGroup_ID
<other product properties>

风险_组

RiskGroup_ID
<other group properties>

费用

Costs_RiskID
Costs_Change_Number
Costs_FY
Cost_Risk_Amount

我可以使用此代码按年份获取总成本:

SELECT Risk_Groups.RiskGroup_ID, Costs.Costs_FY, Sum(Costs.Costs_Risk_Amount) AS TotalAmount
FROM (Risk_Groups LEFT JOIN 
Risks 
ON Risk_Groups.RiskGroup_ID = Risks.Risks_RiskGroup_ID) 
LEFT JOIN Costs ON (Risks.Risks_Change_Number = Costs.Costs_Change_Number) AND (Risks.Risks_RiskID = Costs.Costs_RiskID)
where Risk_Groups.RiskGroup_ID = 'My test group'
GROUP BY Risk_Groups.RiskGroup_ID, Costs.Costs_FY

我明白了

RiskGroupID           Costs_FY     TotalAmount  
My test group         FY 23          0  
My test group         FY 24          100000  
My test group         FY 25          120000

但有些风险有多个版本,我只想将最新版本的成本相加。 我使用此语句来查看每个产品的最新更改#。

(select r.Risks_RiskID, r.Risks_change_number, r.Risks_RiskGroup_ID
    from risks r
        inner join (
           select risks_Riskid, max(risks_change_number) as maxversion 
           from risks maxr group by risks_riskid) maxr 
           on r.Risks_RiskID = maxr.Risks_RiskID and r.Risks_Change_Number = maxr.MaxVersion)

我正在尝试使用每个风险的最新风险版本的视图来代替摘要查询中的风险表。过去,我用子查询替换了查询中的 from table 子句。但我想使用子查询代替 Risks 表。我尝试像这样替换它

SELECT Risk_Groups.RiskGroup_ID, Costs.Costs_FY, Sum(Costs.Costs_Risk_Amount) AS TotalAmount
FROM (Risk_Groups 
LEFT JOIN 

(select r.Risks_center_rank, r.Risks_RiskID, r.Risks_change_number, r.Risks_RiskGroup_ID 
    from risks r
        inner join (
           select risks_Riskid, max(risks_change_number) as maxversion 
           from risks maxr group by risks_riskid) maxr 
           on r.Risks_RiskID = maxr.Risks_RiskID and r.Risks_Change_Number = maxr.MaxVersion) 

ON Risk_Groups.RiskGroup_ID = r.Risks_RiskGroup_ID) 
LEFT JOIN Costs ON (r.Risks_Change_Number = Costs.Costs_Change_Number) AND (r.Risks_RiskID = Costs.Costs_RiskID)
where Risk_Groups.RiskGroup_ID = 'My test group'
GROUP BY Risk_Groups.RiskGroup_ID, Costs.Costs_FY

但是我收到一个错误,指出关键字 ON 附近的语法不正确(指第一个 ON 语句),我用表名 r 替换了表名 Risks,但在我看来 r 是不被识别为桌子。

sql
1个回答
0
投票

子查询

(select r.Risks_center_rank
...
and r.Risks_Change_Number = maxr.MaxVersion)
成为虚拟表并需要名称。在下图中,我将其称为“LatestRisks”

那么外层 select 的其他部分只能通过该名称引用数据,而不能引用子查询中涉及的任何表。

那么,Risk_Groups 的加入应该是

Risk_Groups.RiskGroup_ID = LatestRisks.Risks_RiskGroup_ID
,而成本的加入应该是这样的
ON (LatestRisks.Risks_Change_Number = Costs.Costs_Change_Number) AND (LatestRisks.Risks_RiskID = Costs.Costs_RiskID)

这是更新后的查询,布局稍作修改,以帮助我理解表关系。

SELECT Risk_Groups.RiskGroup_ID, Costs.Costs_FY, Sum(Costs.Costs_Risk_Amount) AS TotalAmount
FROM 
    (Risk_Groups 
    LEFT JOIN 
        (select     r.Risks_center_rank, r.Risks_RiskID, r.Risks_change_number, r.Risks_RiskGroup_ID 
            from    risks r
                    inner join 
                    (select risks_Riskid, max(risks_change_number) as maxversion 
                        from risks maxr group by risks_riskid
                    ) maxr on r.Risks_RiskID = maxr.Risks_RiskID and r.Risks_Change_Number = maxr.MaxVersion
        ) AS LatestRisks ON Risk_Groups.RiskGroup_ID = LatestRisks.Risks_RiskGroup_ID
    ) 
    LEFT JOIN Costs ON (LatestRisks.Risks_Change_Number = Costs.Costs_Change_Number) AND (LatestRisks.Risks_RiskID = Costs.Costs_RiskID)
where Risk_Groups.RiskGroup_ID = 'My test group'
GROUP BY Risk_Groups.RiskGroup_ID, Costs.Costs_FY
© www.soinside.com 2019 - 2024. All rights reserved.