【问题标题】:Table variable join equivalent in OracleOracle中的表变量连接等价物
【发布时间】:2021-11-08 12:28:27
【问题描述】:

我得到了一个很大的表 My_Table 和一个用户定义的集合 Picture_Arr 作为输入,通常有 5-10 行声明为:

TYPE Picture_Rec IS RECORD (
     seq_no                         NUMBER,
     task_seq                       NUMBER); 
TYPE Picture_Arr IS TABLE OF Picture_Rec;

在 MS SQL 中,我通常会写如下内容:

DECLARE @Picture_Arr TABLE (seq_no INT, task_seq INT)
SELECT M.*
FROM My_Table M
INNER JOIN @Picture_Arr A
  ON M.seq_no = A.seq_no AND M.task_seq = A.task_seq

但我不知道如何在 Oracle 中重写相同的代码,因为 Picture_Arr 不是表格。正如一些教程所述,我本可以遍历 My_Table 并比较键,但它在 Oracle 中是否有效,或者有其他方法吗?

【问题讨论】:

  • 请描述一下如何获取Picture_Arr 类型变量的数据? T-SQL代码sn -p没有变量初始化,所以不清楚应该join什么,如何准备join的数据。
  • 您真正想要实现的目标是什么?如果你知道这些值并且你可以用它们填充一个数组,为什么你不能用相关的IN 子句(select * from my_table where (seq_no, task_seq) in ((1,2), (3,4), (5,6)))编写一个查询?
  • 发生了很多事情,所以我将所有内容都简化为简单的select 声明。 Picture_Arr 的数据填充在其他地方,实际上在生成的代码中声明了类型。我只剩下返回另一个集合的函数体模板。

标签: sql oracle join record


【解决方案1】:

也许这就是你要找的。理解期望的输出是什么,以及记录的数据是否存储在某个地方有点复杂

create type Picture_Rec as object(
seq_no                         NUMBER,
task_seq                       NUMBER); 
)
/

create type Picture_Tab as table of Picture_Rec
/

create or replace function get_picture_list
return Picture_Tab
is
  l_pic Picture_Tab;
begin
   select Picture_Rec ( seqno, taskseq )
   bulk collect into l_pic
   from your_table; -- the table you have these records
   return l_pic;
end;
/

然后你运行

SELECT M.*
FROM My_Table M
JOIN TABLE ( get_picture_list() ) p 
  ON M.seq_no = p.seq_no AND M.task_seq = p.task_seq

【讨论】:

  • 我在JOIN 子句中错过了TABLE 关键字!
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多