Oracle 相当于 CROSS APPLY VALUES

Oracle equivalent of CROSS APPLY VALUES

我有一个神谕table喜欢

CREATE TABLE UnPivotMe (
    FirstName varchar2(255) NOT NULL, 
    LastName varchar2(255) NOT NULL,
    Question1 varchar2(1000) NOT NULL,
    Answer1 varchar2(1000) NOT NULL,
    Question2 varchar2(1000) NOT NULL,
    Answer2 varchar2(1000) NOT NULL,
    Question3 varchar2(1000) NOT NULL,
    Answer3 varchar2(1000) NOT NULL,
    Question4 varchar2(1000) NOT NULL,
    Answer4 varchar2(1000) NOT NULL,
    Question5 varchar2(1000) NOT NULL,
    Answer5 varchar2(1000) NOT NULL
    )

Table 有一些数据像

INSERT INTO UnPivotMe VALUES
   ('Kenneth','Fisher','What is your first name?','Kenneth','What is your favorite color?','green','What do you do for a living?','Not much',
           'What is 2x3','6','Why?','Because'),
   ('Bob','Smith','What is your first name?','Robert','What is your favorite color?','blue','What is 4x7?','238',
           'What is 7x6','Life the Universe and Everything','Why?','Why not'),
   ('Jane','Doe','What is your first name?','John','What is your favorite color?','plaid','What do you do for a living?','Door to door salesman',
           'What is 3/4','.75','Why?','yes'),
   ('Prince','Charming','What is your first name?','George','What is your favorite color?','Orange','What do you do for a living?','Not much',
           'What is 1235x523','Yea right','Why?','no')

在 SQL Server 2016 我可以做到

SELECT UnPivotMe.FirstName, UnPivotMe.LastName, 
        CrossApplied.Question, CrossApplied.Answer
FROM UnPivotMe
CROSS APPLY (VALUES (Question1, Answer1),
                    (Question2, Answer2),
                    (Question3, Answer3),
                    (Question4, Answer4),
                    (Question5, Answer5)) 
            CrossApplied (Question, Answer)

我知道 Oracle 也有交叉应用,但 Oracle 有 values 子句吗?

如果不是,请问对应的 oracle 是什么。

我在 Oracle 12c

使用SELECT ... FROM dualUNION ALL

SELECT UnPivotMe.FirstName, UnPivotMe.LastName, 
        CrossApplied.Question, CrossApplied.Answer
FROM UnPivotMe
CROSS APPLY (
   SELECT Question1 As Question, Answer1 As Answer FROM dual Union All
   SELECT Question2, Answer2 FROM dual Union All
   SELECT Question3, Answer3 FROM dual Union All
   SELECT Question4, Answer4 FROM dual Union All
   SELECT Question5, Answer5 From dual
) CrossApplied
;

但是 Oracle 11g/12c 有一个特殊的查询来取消透视 table:

SELECT FirstName, LastName, 
       Question, Answer
FROM UnPivotMe
UNPIVOT (
    (Question, Answer) FOR  (q, a) 
    IN 
    ( (Question1, Answer1),(Question2, Answer2),
      (Question3, Answer3),(Question4, Answer4),
      (Question5, Answer5))
)
;

您也可以使用老式但简单的 unpivt 查询

SELECT FirstName, LastName, Question1 as Question, Answer1 As answer
FROM UnPivotMe UNION ALL
SELECT FirstName, LastName, Question2 , Answer2
FROM UnPivotMe UNION ALL
SELECT FirstName, LastName, Question3 , Answer3
FROM UnPivotMe UNION ALL
SELECT FirstName, LastName, Question4 , Answer4
FROM UnPivotMe UNION ALL
SELECT FirstName, LastName, Question5 , Answer5
FROM UnPivotMe