我一直在寻找Oracle中的某些东西,它就像SQL Server中的表变量一样。我发现人们在这里提出这样的问题并且人们总是说“是的,Oracle有这个”,但是这些例子表明这些实体根本不像SQL Server。有人能告诉我如何在Oracle中执行以下简单的TSQL解决方案吗?
declare @users table (
ID int,
Name varchar(50),
Age int,
Gender char(1)
)
;with users as (
select 1001 as ID, 'Bob' as Name, 25 as Age, 'M' as Gender
union
select 1021 as ID, 'Sam' as Name, 29 as Age, 'F'
)
insert into @users (ID, Name, Age, Gender)
select * from users
declare @grades table (
UserID int,
ClassID int,
Grade int
)
;with grades as (
select 1001 as UserID , 120 as ClassID, 4 as Grade
Union
select 1001 as UserID , 220 as ClassID, 2 as Grade
Union
select 1021 as UserID , 130 as ClassID, 4 as Grade
Union
select 1021 as UserID , 230 as ClassID, 4 as Grade
Union
select 1021 as UserID , 340 as ClassID, 2 as Grade
)
insert into @grades
select * from grades
select u.ID, u.Name, GPA = AVG(cast(g.grade as decimal))
from @users u
inner join @grades g on u.ID=g.UserID
group by u.ID, u.Name
答案 0 :(得分:2)
有些答案可能会告诉您Oracle有表变量,并且在某种程度上确实如此。但是,大多数答案都会告诉您,您根本不应该在Oracle中这样做;根本没有必要。
在你的情况下,我只想使用CTE:
with users as (
select 1001 as ID, 'Bob' as Name, 25 as Age, 'M' as Gender from dual
union
select 1021 as ID, 'Sam' as Name, 29 as Age, 'F' from dual
)
, grades as (
select 1001 as UserID , 120 as ClassID, 4 as Grade from dual
Union
select 1001 as UserID , 220 as ClassID, 2 as Grade from dual
Union
select 1021 as UserID , 130 as ClassID, 4 as Grade from dual
Union
select 1021 as UserID , 230 as ClassID, 4 as Grade from dual
Union
select 1021 as UserID , 340 as ClassID, 2 as Grade from dual
)
select u.ID, u.Name, AVG(g.grade) as gpa
from users u
join grades g on u.ID = g.UserID
group by u.ID, u.Name
更新:我一直试图获得的答案很长一段时间在Ben的评论中,我在这里包括: “没有变量,你可以动态创建并加入标准SQL @wcm中的其他表,是的。有许多不同类型的对象可以创建,允许你这样做,但不完全就像在T-SQL中那样“。
答案 1 :(得分:2)
如果我理解正确,那么如果我需要暂时存储仅限于我的会话可见的数据,那么我将使用全局临时表。可能比在内存中存储更多的开销,但也有很多优点 - 收集它们的统计数据,索引它们,以及存储数据的能力而不考虑内存消耗。