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 dual
和UNION 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
我有一个神谕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 dual
和UNION 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