标签: inline-view

SQL - SubQuery和外表之间的关系

问题

我需要更好地理解有关何时可以在子查询中引用外部表以及何时(以及为什么)这是不合适的请求的规则.我在Oracle SQL查询中发现了一个重复,我正在尝试重构,但是当我尝试将我的引用表转换为分组子查询时,我遇到了问题.

以下声明适用:

SELECT  t1.*  
FROM    table1 t1, 
INNER JOIN table2 t2 
        on t1.id = t2.id        
        and t2.date = (SELECT max(date) 
                       FROM   table2  
                       WHERE  id = t1.id) --This subquery has access to t1
Run Code Online (Sandbox Code Playgroud)

不幸的是,table2有时会有重复的记录,所以在将它加入t1之前我需要首先聚合t2.但是,当我尝试将其包装在子查询中以完成此操作时,SQL引擎突然无法再识别外部表.

SELECT  t1.* 
FROM    table1 t1, 
INNER JOIN (SELECT * 
            FROM  table2 t2
            WHERE t1.id = t2.id              --This loses access to t1
              and t2.date = (SELECT max(date) 
                             FROM   table2 
                             WHERE  id = t1.id)) sub on t1.id = sub.id 
                             --Subquery loses access to t1
Run Code Online (Sandbox Code Playgroud)

我知道这些是根本不同的查询,我要求编译器放在一起,但我不知道为什么一个会工作而不是另一个.

我知道我可以复制子查询中的表引用,并有效地将子查询从外部表中分离,但这似乎是完成此任务的一种非常难看的方式(所有代码和处理的重复都是如此).

有用的参考资料 …

sql subquery derived-table correlated-subquery inline-view

13
推荐指数
1
解决办法
2万
查看次数