sql - Oracle 中的交叉应用

标签 sql oracle

我已经使用 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 joincase 语句即可在两个数据库中编写此查询。由于 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/

相关文章:

SQL 内连接查询返回两个相同的列

sql - 计算连续 7 天内重复调用者的数量

oracle - 如何批量更新oracle pl/sql中的大表以避免用完undospace?

Oracle OCI 连接池与 Oracle UCP

oracle - 设置 ORACLE_HOME 的正确方法?

php - ctype_alnum 对抗 SQL 注入(inject)

sql - 根据条件删除重复项

sql - 如何获得可链接的标签?

oracle - 如何将云中托管的 Oracle DB 与 MS Azure 逻辑应用程序连接

多条语句的 PHP oci_execute