PL/SQL新手-返回多个结果集问题

PL/SQL新手-返回多个结果集问题,sql,database,oracle,plsql,oracle10g,Sql,Database,Oracle,Plsql,Oracle10g,好的-我对SQL Server有相当广泛的背景知识,但我以前只在Oracle中混过一阵子。嗯,推送已经到了紧要关头,我需要创建一个相对复杂的查询。本质上,它可以归结为T-SQL: SELECT Col1 INTO #tmpTable FROM Table1 WHERE Col3 = @paramValue SELECT Col1 FROM #tmpTable SELECT OtherCol FROM Table2 INNER JOIN #tmpTable ON Table1.Col1

好的-我对SQL Server有相当广泛的背景知识,但我以前只在Oracle中混过一阵子。嗯,推送已经到了紧要关头,我需要创建一个相对复杂的查询。本质上,它可以归结为T-SQL:

SELECT Col1 
INTO #tmpTable
FROM Table1
WHERE Col3 = @paramValue

SELECT Col1
FROM #tmpTable

SELECT OtherCol
FROM Table2
INNER JOIN #tmpTable 
  ON Table1.Col1 = Table2.fkCol1
这个序列的原因是,对Table1的初始调用非常繁重(~5s运行时),因为它是针对数据仓库的一个非常复杂的调用。我想在单独的调用中返回表2中的结果,因为表2中的每一条记录都可能有5-10条记录,这使我的前端数据透视更容易

我知道我能做到

SELECT Table1.Col1, Table2.OtherCol
FROM Table1
LEFT JOIN Table2 
  ON Table1.Col1 = Table2.fkCol1
然后重新规范化前端的数据(仅处理Col1的第一条记录,然后处理所有其他col记录,直到发现新的Col1)

不过,我不是数据库专家,所以我不确定哪种方法更好。从开发人员的角度来看,第一个解决方案对我来说更容易使用。它(直觉)看起来更有效,因为不必返回表1和表2的“厚”结果。表1将返回约1200行,宽约2kb。表2明显更精简(约20字节宽),但行数更多(6000-12000)


所以,最终我的问题是,对于PL/SQL环境,哪种解决方案是最好的,如果是第一种,那么最好的方法是什么?全局临时表/光标/子选择/什么?

我会使用连接。它更容易编码和阅读,并且应该比三个单独的选择更快。如果您只选择
Col1
,则整行的“厚度”无关紧要。

如果您担心性能,您应该测试它并比较结果。我个人赞成加入解决方案。Oracle将在幕后完成其工作,并可能提高您的性能


您还应该检查查询的执行计划。我确信您的开发环境允许您快速查看执行计划。查询的成本将使您对正在发生的事情有一个很好的了解,并将帮助您做出决定。

针对您关于不知道如何实施第一个解决方案的评论:

procedure get_data(p_paramValue in varchar2, 
                  c_data1 out sys_refcursor,
                  c_data2 out sys_refcursor)
is
  v_tmptable in varchar2(30);
begin
  SELECT Col1 INTO v_tmpTable
  FROM Table1
  WHERE Col3 = p_paramValue;

  open c_data1 for 'SELECT Col1 FROM '||v_temptable;

  open c_data2 for
    'SELECT OtherCol FROM Table2 INNER JOIN '||v_tmpTable|| 
    ' ON Table1.Col1 = Table2.fkCol1'; 
end get_data;

假设Table1.Col1中的数据是可信的,因为两个游标中都存在注入漏洞。

第二个解决方案显然更容易编写SQL!英雄联盟我想我们只会在它出现时优化性能,是吗p如果在一周内(我的截止日期)没有其他人能更好地回答这个问题,我将标记为已接受!我同意丹尼斯的观点,加入并不是邪恶的,也不是应该避免的。要简单得多。如果您只需要执行连接,请避免pl/sql游标循环等。在第一段代码中,您真的是从同一个Col1与参数匹配的表中选择了Col1,还是过于简化了?@Gary Myers:lol我想我会更改名称-只是过于简化了。不幸的是,我不知道如何实现第一个解决方案,所以我无法比较。否则的话,我早就这么做了。