![]() |
1
1
您已经得到了相关子选择和嵌套表表达式(NTE)的组合。 就我个人而言,如果我必须保持它,我会称之为冒犯 考虑常见的表表达式(&P);联接。。。如果没有数据和tabvle结构,我无法给出真正的语句,但一般形式如下
CTE优于NTE的两个重要原因。。。CTE的结果可以重用,也可以轻松地用CTE增量构建语句。 我的意思是你可以
优化器可以选择为cte1构建临时结果集并多次使用。从建筑的角度来看,你可以看到我在建造前面的每个cte。 这是一篇好文章 https://www.mcpressonline.com/programming/sql/simplify-sql-qwithq-common-table-expressions 编辑 让我们深入研究您的第一个相关子查询。
您要求DB做的是,对于ECD0REP中读取的每一行,从ECDHREP中获取一行。如果您运气不好,DB将不得不读取ECDHREP中的大量记录才能找到那一行。通常,考虑使用相关子查询时,内部查询需要读取 每一个 一行所以如果外部有M行,内部有N行。。。然后您将看到正在读取的MxN行。 我以前见过这种情况,尤其是在IBM I上。因为RPG开发人员会这样做
但在SQL中,这不是实现它的方法。SQL应该是基于集合的。 因此,您需要做的是考虑如何从ECDHREP中选择与您想要从ECD0REP中获得的记录集相匹配的记录集。
现在也许这不太正确。也许ECDHREP中有多行具有相同的值(DHAOEQ、DHJRCD);因此,您需要
现在,您正在处理多组记录,将它们连接在一起以获得最终结果。 更糟糕的情况是,DB必须读取M+N条记录。 这不是关于表演,而是关于成套思维。 当然,对于使用相关子查询的简单语句,优化器可能能够将其重新写入联接。 但最好是尽可能编写最好的代码,而不是希望优化器能够纠正它。 我看到并重写了100个相关的查询;常规子查询。。。。事实上,我看到一个查询必须分成两部分,因为有两个多个子查询。DB对每条语句的限制为256。 |
![]() |
2
1
如果
sub select和CTE之间有什么区别?
vs。
这实际上只是个人喜好,尽管根据具体需求,CTE可以在SQL语句中多次使用,但在其他情况下,如
编辑
输出集中每行只需读取一条记录。我认为这并不十分繁重。第三个相关子查询也是如此。 第一个相关子查询上的索引为:
第二个相关子查询可能需要每行多读一次,这只是因为
|
|
Johnny T · 基于当前值的SQL合并表[重复] 7 月前 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 8 月前 |
![]() |
ojek · 如何对SQL结果进行分组和编号? 8 月前 |
![]() |
senek · 如何在PL/SQL中将选择结果(列)放入数组中 8 月前 |
![]() |
Sax · 规范化Google表格(第一步) 8 月前 |
![]() |
Jatin · 检索卷计数的动态sql抛出错误语法错误[关闭] 8 月前 |
![]() |
Andrus · 如何在sql中查找第二个匹配项 8 月前 |