【发布时间】:2011-03-17 19:52:18
【问题描述】:
好的 - 我在 SQL Server 方面拥有相当广泛的背景,但我之前只在 Oracle 中闲逛过。好吧,push 已经到了紧要关头,我需要创建一个相对复杂的查询。本质上,它在 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 的初始调用非常繁重(约 5 秒运行时间),因为它是对我们的数据仓库的高度复杂的调用。我想在单独的调用中返回 Table2 的结果,因为 Table2 中的每个记录可能有 5-10 条记录,这使我的前端透视更容易。
我知道我可以做到
SELECT Table1.Col1, Table2.OtherCol
FROM Table1
LEFT JOIN Table2
ON Table1.Col1 = Table2.fkCol1
然后在前端重新规范化数据(只处理 Col1 的第一条记录,然后处理所有 OtherCol 记录,直到我发现新的 Col1)
不过,我不是数据库专家,所以我不确定哪种方法更好。从开发人员的角度来看,第一个解决方案对我来说更容易使用。它也(直觉)看起来更高效,因为不必返回与 Table2 耦合的 Table1 的“厚”结果。 Table1 将返回约 1200 行,宽约 2kb。 Table2 明显更精简(约 20 字节宽),但行数更多(6000-12000)。
所以,最终我的问题是,哪种解决方案最适合 PL/SQL 环境,如果是第一个,那么最好的解决方案是什么?全局临时表/光标/子选择/什么?
【问题讨论】:
-
在第一段代码中,你真的是从同一个 Col1 匹配参数的表中选择 Col1,还是被过度简化了?
-
@Gary Myers:哈哈,我想我会改一下名字——这太简单了。
标签: sql database oracle plsql oracle10g