Выберите строку с некоторым минимальным значением, в то время как получите ошибку «больше чем 1 значение»? - PullRequest
0 голосов
/ 09 декабря 2018

Я хотел бы сделать что-то вроде этого:

    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;

1 Ответ

0 голосов
/ 09 декабря 2018

Если вы выполняете вычисление в 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 
...