【问题标题】:Select the row with some minimum value while get 'more than 1 value'error?在出现“超过 1 个值”错误时选择具有某个最小值的行?
【发布时间】: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


【解决方案1】:

如果您在 cte 中执行计算,则重复使用该 cte

WITH cte
AS (
    SELECT
          *
        , SQRT( SQUARE( Launch_temperature - 70 ) ) AS value
    FROM challenger
)
SELECT
    *
FROM cte
WHERE value = (SELECT MIN( value ) FROM cte)
ORDER BY
    value

您现在看到ABS(Launch_temperature) 是要求,另一种方法是:

SELECT
    *
FROM (
    SELECT
        *
      , ROW_NUMBER() OVER (ORDER BY ABS( Launch_temperature )) AS rn
    FROM challenger
) AS d
WHERE rn = 1 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-17
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多