为啥 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 图像中的方法会产生不同的结果?
Google Location API vs. Maps:为啥相同的查询会产生不同的结果?