为啥 SQL 子查询中的外部引用会产生不同的结果?

Posted

技术标签:

【中文标题】为啥 SQL 子查询中的外部引用会产生不同的结果?【英文标题】:Why does outer reference in SQL subquery produce different results?为什么 SQL 子查询中的外部引用会产生不同的结果? 【发布时间】:2019-07-24 11:11:37 【问题描述】:

我运行两个 SQL 查询:第一个对子查询内的表有一个外部引用。在第二个中,我在子查询中添加了同一个表。结果不同,由于多行而失败。

第一个在 Oracle 上运行,但在 Spark-SQL 上失败。因此,我正在寻找类似于第一个 SQL 代码中的 Oracle SQl 的解决方案。

查询 1:

select *, 
(select N_CODE 
from table2 f 
where f.ID1 = (select min(f.ID1) 
               from table1 a left join table2 f on a.ID2 = f.ID2
               where a.ID2 = table1.ID2 
               ) 
) AS CODE

from table1

查询 2:

select *, 
(select N_CODE 
from table1 t, table2 f 
where f.ID1 = (select min(f.ID1) 
               from table1 a left join table2 f on a.ID2 = f.ID2
               where a.ID2 = t.ID2 
               ) 
) AS CODE

from table1

第二个是我在 Spark SQL 中对第一个的解决方案,但它在 Oracle 和 Spark 上都失败了。如何在类似于 Oracle 的 Spark SQL 上运行第一个查询?

请不要修改查询的结构。

【问题讨论】:

Spark-SQL 错误:某种“table1.ID2 丢失...” 您的查询不完整。特别是,table1 没有在第一个中定义。不要让我们猜测查询的真实情况。 不要使用古老的连接语法from table1 t, table2 f。请改用from table 1 t inner join table 2 f on ...。 ` @Pavel:您的建议产生:“单行子查询返回多于一行” @NasimiEldarov,可能,如果没有看到数据,我不能说更多。第一个查询有什么问题?在 Spark 上运行时遇到什么错误? 【参考方案1】:

Oracle 支持多个内部查询,但 spark 不支持。克服它的最佳方法是将您的超级查询分成几部分并使用连接它们。

例如运行此部分并将其保存为 table3:

select min(table2 .ID1)
           from table1 a left join table2 f on a.ID2 = f.ID2
           where a.ID2 = t.ID2
from table2

然后将其用于您的主要查询:

....
where f.ID1 = table3

【讨论】:

以上是关于为啥 SQL 子查询中的外部引用会产生不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这两种将图像从 SQL CE 加载到 WPF 图像中的方法会产生不同的结果?

为啥这两个 NHibernate 查询会产生不同的结果?

Google Location API vs. Maps:为啥相同的查询会产生不同的结果?

将普通查询转换为子查询会产生不同的结果

为啥此相关子查询在 Oracle 和 SQL Server 中的工作方式不同

为啥 SQL Server 2019 与 Azure SQL 数据库中的外部表语法不同? `