这个 SQL 选择结构叫啥?
Posted
技术标签:
【中文标题】这个 SQL 选择结构叫啥?【英文标题】:what is this SQL select construct called?这个 SQL 选择结构叫什么? 【发布时间】:2011-04-15 17:54:01 【问题描述】:以下选择语句中以粗体显示的 select 结构的术语是什么?
选择 a.t1 作为 a,(从 b WHERE b.x = a.t1 选择 b.n 作为 b), c.t2 作为 c 从 a, c WHERE a.x = c.x
我在解释这可以在 oracle 中完成,但当被问到它叫什么时,我想不出任何术语。有这个术语吗?还是只是选择一个选择结果?
编辑:扩展查询以使子查询使用清晰
【问题讨论】:
一分钟内有四个答案,都称其为略有不同。我喜欢 SQL... 这显然是一个子查询,但我认为它是guigui42 suggests 的标量还是RedFilter suggests 的相关取决于您遗漏的部分。至少,这是 mysql 人员使用的术语:dev.mysql.com/doc/refman/5.0/en/subqueries.html @TJ:它实际上可能是两者,也可能两者都不是,尽管如果它不是标量,查询会爆炸...... @RedFilter:好点!所以假设它是函数式的,它要么是一个标量子查询,要么是一个标量相关子查询。 另外,这个“相关标量子查询”在大多数情况下可以很容易地被 INNER JOIN 代替,更容易阅读,效率更高! 【参考方案1】:这是一个子查询。如果b.n
在外部查询中引用别名为b
的表,则可以将其称为correlated subquery。
正如 guigui42 所指出的,它也是一个 scalar
查询,因为它最多只返回一列和一行。事实上,您必须注意确保最多只返回一行,否则查询可能会在以后崩溃。这通常通过使用 TOP 1
或等效项来防止。
【讨论】:
"...因为它指的是外部查询中的一个表。" 是吗?我很想念它。 可能是,WHERE
之后的“...”会留下一个大大的问号...
@TJ:你是对的,我错误地假设b.n
引用了查询之外的表。我们无法从发布的片段中看出这一点。我会更新我的回复。
@RedFilter:嗯,你是否弄错还不清楚。你很可能是对的。无论如何,这是一个很好的答案。
更准确地说,我认为它是一个“标量相关子查询”,因为它在 select 子句中每行返回一个且只有一个结果。
看起来“标量相关子查询”可能是最准确的术语【参考方案2】:
我会说“标量子查询”
编辑:正如 RedFilter 所说,它也是一个相关的子查询。
所以它是一个标量相关子查询
【讨论】:
嗯,它可能被证实了。它可能没有,OP 没有给我们足够的工作。 怎么可能不是关联子查询?问题(未修改)说“(SELECT b.n as b FROM n WHERE ...)”; b.n 列必须来自表“n”以外的其他地方,不是吗? (除非有一种方法可以在表中嵌套结构化类型,在这种情况下,表 N 可能包含一个复合列 B,其中包含一个组件 N……Oracle 会沉迷于这些东西吗?某些 ORDBMS 会这样做。) @Jonathan Leffler:在这种情况下,没有证据表明主查询的FROM
子句中的表会出现在标量子查询的WHERE
子句中。
@onedaywhen:b.n
中的b
是什么?
@onedaywhen:此外,主查询中的表可以出现(并且似乎出现)在选择列表中;这将使它成为一个相关查询,无论表是否在 WHERE 中提及。【参考方案3】:
嵌套子查询。
...如果使用不当(这种情况经常发生),性能也会很差。
【讨论】:
顺便说一句,这被用来替换 oracle case 语句,用描述性术语替换 ID 代码。它的可读性更高,性能也可以接受。【参考方案4】:这被称为sub-select
。
【讨论】:
很多东西都是子选择。我需要更具体的东西。以上是关于这个 SQL 选择结构叫啥?的主要内容,如果未能解决你的问题,请参考以下文章