SQL Server中的嵌套选择语句


387

为什么以下工作不起作用?

SELECT name FROM (SELECT name FROM agentinformation)

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

SELECT name FROM agentinformation

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

Answers:


672

您需要给子查询加上别名。

SELECT name FROM (SELECT name FROM agentinformation) a  

或者更明确

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

76
确保您的别名也有些冗长!当我开始用t1,t2,t3,t4,t5,t6做杂工时,我很爱
Doug Chamberlain

2
where子句将在哪里进行外部查询?
Panic Panic 2012年

3
@ColonelPanic:外部查询的WHERE子句将在最后添加。
Joe Stefanelli 2012年

“对,我是个白痴!谢谢,一经接受就会接受。” 没事 只是无知。像我们所有人一样。
Lucio Mollinedo

2
Oracle接受select不带别名的第一个。
Kjetil S.

49

Joe Stefanelli提供的答案已经是正确的。

SELECT name FROM (SELECT name FROM agentinformation) as a  

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

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

  • WHERE表达式[NOT] IN(子查询)
  • 表达式expression_operator [ANY | 全部](子查询)
  • [NOT]不存在(子查询)

检查更多的子查询规则子查询类型

嵌套子查询的更多示例

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

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

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

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

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

  1. EXISTS – EXISTS关键字产生一个布尔值[TRUE / FALSE]。此EXISTS检查子查询返回的行是否存在。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.