SQL Server 中的嵌套选择语句

Posted

技术标签:

【中文标题】SQL Server 中的嵌套选择语句【英文标题】:Nested select statement in SQL Server 【发布时间】:2011-06-05 12:35:01 【问题描述】:

为什么以下方法不起作用?

SELECT name FROM (SELECT name FROM agentinformation)

我猜我对 SQL 的理解是错误的,因为我原以为这会返回与

相同的东西
SELECT name FROM agentinformation

内部 select 语句不会创建外部 SELECT 语句然后查询的结果集吗?

【问题讨论】:

【参考方案1】:

Joe Stefanelli 提供的answer 已经正确。

SELECT name FROM (SELECT name FROM agentinformation) as a  

我们需要为子查询创建别名,因为查询需要一个表对象,我们将从为子查询创建别名中获得该对象。从概念上讲,子查询结果被替换到外部查询中。由于我们在外部查询中需要一个表对象,所以我们需要为内部查询创建一个别名。

包含子查询的语句通常采用以下形式之一:

WHERE 表达式 [NOT] IN(子查询) WHERE 表达式比较运算符 [ANY | ALL](子查询) WHERE [NOT] EXISTS(子查询)

查看更多subquery rules 和subquery types。

More examples 的嵌套子查询。

    IN / NOT IN – 此运算符在执行内部查询后获取内部查询的输出,该输出可以是零个或多个值,并将其发送到外部查询。然后外部查询获取所有匹配的 [IN 运算符] 或不匹配的 [NOT IN 运算符] 行。

    ANY – [>ANY 或 ANY 运算符获取内部查询产生的值列表,并获取所有大于列表最小值的值。

例如>ANY(100,200,300),ANY 运算符将获取所有大于 100 的值。

    ALL – [>ALL 或 ALL 运算符获取内部查询产生的值列表,并获取所有大于列表最大值的值。这

例如>ALL(100,200,300),ALL 运算符将获取所有大于 300 的值。

    EXISTS – EXISTS 关键字产生一个布尔值 [TRUE/FALSE]。这个 EXISTS 检查子查询返回的行是否存在。

【讨论】:

【参考方案2】:

您需要为子查询设置别名。

SELECT name FROM (SELECT name FROM agentinformation) a  

或者更明确

SELECT a.name FROM (SELECT name FROM agentinformation) a  

【讨论】:

确保你的别名也有点冗长!我喜欢和 t1,t2,t3,t4,t5,t6 一起工作 外部查询的where 子句在哪里? @ColonelPanic:外部查询的 WHERE 子句将在最后添加。 “好吧,我是个白痴!谢谢,一旦允许就会接受。”不。只是无知。像我们所有人一样。 Oracle 接受第一个不带别名的select

以上是关于SQL Server 中的嵌套选择语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在动态SQL(SQL Server)中的Select语句中使用游标值

SQL Server 2008 - SELECT 子句中的 Case / If 语句 [重复]

SQL server 2008R2中怎么直接修改表内数据

HiveQL SELECT语句查询

WHERE 子句中的 SQL 查询子选择优化 (SQL Server)

SQL Server 之 子查询与嵌套查询