因此,我根据马丁·史密斯(Martin Smith)在上面所做的评论(谢谢马丁!)来弄清了这一点,并希望确保将我的发现分享给其他遇到此问题的人。
技术注意事项
首先,如果我使用正确的术语来描述我的问题,那肯定会有所帮助:上面的第一条语句使用了 相关的子查询 :
- http://en.wikipedia.org/wiki/Correlated_subquery
- http://www.programmerinterview.com/index.php/database-sql/correlated-vs-uncorrelated-subquery/
实际上,这是一种回退数据的效率很低的方式,因为它为外部表中的每一行重新运行子查询。因此,我将寻找在我的代码中消除这些子查询类型的方法:
- https://blogs.oracle.com/optimizer/entry/optimizer_transformations_subquery_unesting_part_1
另一方面,我的第二条语句使用的是Oracle中的 内联视图 ,在SQL Server中也称为 派生表 :
- http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries007.htm
- http://www.programmerinterview.com/index.php/database-sql/derived-table-vs-subquery/
内联视图/派生表在查询开始时会创建一个临时的未命名视图,然后将其视为另一个表,直到操作完成。因为编译器需要在FROM行上看到这些子查询时创建一个临时视图,所以这些子
查询必须完全独立, 并且在子查询之外没有任何引用。
为什么我在做的事很愚蠢
我在第二张表中试图做的基本上是基于对另一个表的不明确引用创建一个视图,该表超出了我的陈述范围。这就像试图引用您在查询中未明确说明的表中的字段一样。
解决方法
最后,值得注意的是,马丁提出了一种相当聪明但最终效率低下的方式来完成我想做的事情。Apply语句是SQL
Server的专有功能,但是它允许您与派生表之外的对象进行对话:
- http://technet.microsoft.com/zh-CN/library/ms175156(v=SQL.105).aspx
同样,可以通过不同的语法在Oracle中使用此功能:
- Oracle中SQL Server APPLY的等效项是什么?
最终,我将重新评估该查询的整个方法,这意味着我将不得不从头开始重建它(信不信由你,我最初并没有创造出这种怪异的东西-我发誓!)。
非常感谢所有发表评论的人 -这肯定让我很沮丧,但是所有的投入都使我走上了正确的道路!



