我已经使用 CROSS APPLY 在 SQL Server 中编写了一个查询,我需要以某种方式将其转换为 Oracle 语法。我已经四处寻找 Oracle 的等效项,但我不确定如何应用它们。
这是 SQL:
SELECT [f_lForiegnKey], [f_lAnalysisVariableKey], nYear, dBefore, dAfter, szBefore, szAfter
FROM [dbo].[A_STRATS_V]
CROSS APPLY (
SELECT 1 as nYear,[dBefore0], [dAfter0],[szBefore0], [szAfter0] UNION ALL
SELECT 2 as nYear,[dBefore1], [dAfter1],[szBefore1], [szAfter1] UNION ALL
SELECT 3 as nYear,[dBefore2], [dAfter2],[szBefore2], [szAfter2] UNION ALL
SELECT 4 as nYear,[dBefore3], [dAfter3],[szBefore3], [szAfter3] UNION ALL
SELECT 5 as nYear,[dBefore4], [dAfter4],[szBefore4], [szAfter4]
) d (nYear, dBefore, dAfter, szBefore, szAfter)
GO
我读过一些有关横向连接的内容,但我不确定如何应用它。
任何帮助将不胜感激,即使这只是一个类似的例子。
谢谢!
最佳答案
您只需使用 cross join
和 case
语句即可在两个数据库中编写此查询。由于 Oracle 中需要 dual
,语法略有不同:
SELECT s.f_lForiegnKey, s.f_lAnalysisVariableKey, n.nYear,
s.dBefore, s.dAfter,
(case when n.nYear = 1 then s.dBefore0
when n.nYear = 2 then s.dBefore1
when n.nYear = 3 then s.dBefore2
when n.nYear = 4 then s.dBefore3
when n.nYear = 5 then s.dBefore4
end) as s.dBefore,
(case when n.nYear = 1 then s.dAfter0
when n.nYear = 2 then s.dAfter1
when n.nYear = 3 then s.dAfter2
when n.nYear = 4 then s.dAfter3
when n.nYear = 5 then s.dAfter4
end) as s.dAfter,
(case when n.nYear = 1 then s.szBefore0
when n.nYear = 2 then s.szBefore1
when n.nYear = 3 then s.szBefore2
when n.nYear = 4 then s.szBefore3
when n.nYear = 5 then s.szBefore4
end) as s.szBefore,
(case when n.nYear = 1 then s.szAfter0
when n.nYear = 2 then s.szAfter1
when n.nYear = 3 then s.szAfter2
when n.nYear = 4 then s.szAfter3
when n.nYear = 5 then s.szAfter4
end) as s.szAfter
FROM A_STRATS_V s cross join
(select 1 as nYear from dual union all
select 2 from dual union all
select 3 from dual union all
select 4 from dual union all
select 5 from dual union all
) n;
关于sql - Oracle 中的交叉应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24685994/