【问题标题】:Table Variable Style Entities in OracleOracle 中的表变量样式实体
【发布时间】:2014-03-11 10:38:02
【问题描述】:

我一直在寻找一些在 Oracle 中类似于 SQL Server 中的表变量的东西。我发现有人在 SO 上问这样的问题,人们总是说“是的,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

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    有些答案可能会告诉您,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 中一样”。

    【讨论】:

    • 所以你的意思是,即使有各种类型的数组和集合,我们也没有像可以使用标准 SQL 连接到其他表的表一样的表变量?
    • 没有变量,您可以动态创建并加入标准 SQL @wcm 中的其他表,是的。可以创建许多不同类型的对象来允许您执行此操作,但与 T-SQL 中的对象不同。
    • 其他类型的对象,你指的是全局临时表吗?
    • 不一定是@wcm,但这是一种方式;是的。您还可以使用用户定义的类型、嵌套表等。
    • 如果问得不算多,能否请您展示一个使用用户定义类型的示例,以便我在 sql 语句中使用它?
    【解决方案2】:

    如果我理解正确,那么如果我需要临时存储仅限于我的会话可见的数据,那么我将使用全局临时表。可能比存储在内存中的开销更大,但也有很多优点 - 收集关于它们的统计信息、索引它们,以及在不考虑内存消耗的情况下存储数据的能力。

    【讨论】:

    • 我看到使用全局临时表的方式一直是用于长期解决方案,而不是我正在寻找的临时类型的使用。另外,您不需要提升数据库中的权限来创建这些对象吗?
    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 2013-08-02
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多