【发布时间】:2018-12-08 23:12:08
【问题描述】:
我想做这样的事情:
select * from challenger
where sqrt( square(Launch_temperature-70) )=
( select min( sqrt( square(Launch_temperature-70) ) )
from challenger)
但是如果我使用下面的其他两种方式,SQL Server 2017 会给我这样的错误信息:
子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。
with cte(value)
as
(
select sqrt(square(Launch_temperature- 70)) as value
from challenger
)
select * from challenger
order by
(select value from cte) ASC;
或
select * from challenger
order by
(select sqrt(square(Launch_temperature-70)) from challenger) ASC;
这是为什么呢?无论如何要解决这个问题?
编辑:我找到了解决方案! 一种方式:
select top 1 * from challenger
order by
abs(Launch_temperature-70) ASC
另一种方式:
with cte(value)
as
(
select sqrt(square(Launch_temperature- 70)) as value
from challenger
)
select top 1 * from challenger, cte
order by
(value) ASC;
【问题讨论】:
-
该错误实际上是在告诉您这里的问题。您的子查询返回了不止一行。没有聚合、
TOP或连接谓词,因此它将返回与表challenger中一样多的行。如果您运行查询SELECT SQRT(SQUARE(Launch_temperature-70)) FROM dbo.challenger;,您将看到这一点。您的第一个查询有什么问题?它会起作用(可能不是最有效的,但它会运行)。 -
@Larnu 我刚接触 SQL。我认为“order by”是一个放置一些列名或一些带有#values==#original 表的值到“order by”的地方。第一段代码有效,但是否有任何方法可以修改第二和第三段代码以使其正常工作?
-
sqrt(square(n)) = n?那么为什么是平方的平方根呢?您要查找的查询不就是这样:select top 1 * from challenger order by Launch_temperature asc吗? -
谢谢!我没有想到这一点。但实际上它应该是 abs(Lauch_temperature)。 @LukStorms
-
@HABO 关于您添加到问题中的“其他方式”解决方案。请注意,它有一个 cartesion join that one normally tries to avoid。
标签: sql-server tsql common-table-expression