我在选择查询中有一个选择查询,该查询引发错误:“用作表达式的子查询返回的不止一行”[重复]

Posted

技术标签:

【中文标题】我在选择查询中有一个选择查询,该查询引发错误:“用作表达式的子查询返回的不止一行”[重复]【英文标题】:I have a select query inside a select query which throws the error :"more than one row returned by a subquery used as an expression" [duplicate] 【发布时间】:2019-03-27 18:32:22 【问题描述】:

我正在尝试显示多个内容,例如用户 ID、薪水等。 我使用了一个 select 语句来做到这一点。在这个 select 语句中,我需要使用另一个 select 语句来提供“工资的分数”。分数的查询是正确的。当我尝试将此选择用于主选择时,它会给出错误“超过一行返回...” 样本数据:

//sample data
insert into employee(id_user int,salary_date date,salary_value) values 
(3, 2017-06-28, 15)
( 5, 2017-06-26 5)
( 2, 2017-06-20 5)
( 1, 2017-06-20 15)
( 4, 2017-06-17 25)

//expected output:
id date       sal  newdate   days aboveavgsal     date     current/firstsal 
1  2017-06-20 15  2017-05-20   31   N           2017-04-20    0.6
1  2017-05-20 10  2017-04-20   30   N           2017-04-20    0.4
1  2017-04-20 20  2017-03-20   31   Y           2017-03-20    0.8
1  2017-03-20 20  2017-02-20   28   Y           NULL          0.8
1  2017-02-20 15  NULL         NULL N           NULL          0.6

    SELECT  id_user
            , salary_date
            , salary_value
            , lead(salary_date) OVER(PARTITION BY id_user ORDER BY salary_date desc)
            , salary_date::timestamp - lead(salary_date::timestamp) over (PARTITION BY id_user ORDER BY salary_date DESC)
            , CASE WHEN salary_value >= 20 THEN 'Y' ELSE 'N' END
            , CASE WHEN salary_value >= 20 THEN lead(salary_date) OVER(PARTITION BY id_user ORDER BY salary_date DESC) END
            , (SELECT CAST(t1.salary_value AS float) / CAST(t.salary_value AS float) 
               FROM (
                     SELECT  t.id_user
                             , t.salary_value
                             , ROW_NUMBER() OVER(PARTITION BY t.id_user ORDER BY t.salary_date) AS rowrank
                     FROM employee t
                    ) AS t
                    INNER JOIN employee AS t1 ON t1.id_user = t.id_user
                    WHERE t.rowrank = 1
                    GROUP BY t1.id_user, t1.salary_value, t1.salary_date, t.salary_value, t.rowrank
                    ORDER BY t1.id_user, t1.salary_date DESC
              ) AS fraction
    FROM employee


Error starts in this query which i tried enclosing in braces.

    (SELECT  CAST(t1.salary_value AS float) / CAST(t.salary_value AS float) 
     FROM (
           SELECT t.id_user
                  , t.salary_value
                  , row_number() OVER(PARTITION BY t.id_user ORDER BY t.salary_date ) AS rowrank
           FROM employee t) AS t
           INNER JOIN employee t1 ON t1.id_user = t.id_user
           WHERE t.rowrank = 1
           GROUP BY t1.id_user, t1.salary_value, t1.salary_date, t.salary_value, t.rowrank
           ORDER BY t1.id_user, t1.salary_date DESC
          )


【问题讨论】:

尝试通过独立运行子查询来调试,看看它是否返回多行。 此外,似乎没有任何条件将主查询表链接到该子查询以隔离与该主查询链接的一行......所以那里一定缺少一些东西。您是否希望将该子查询链接到主查询而不是使用子查询。 子查询返回多行,所以不能出现在SELECT列表中。也许你可以把它放在FROM 子句中? 而且这有点主观,但是对于这种更复杂的查询,我会非常倾向于写一个更清晰的方式,一切都打包在一起。我在本地这样做只是为了了解发生了什么。在其他问题解决后,我可以建议一种方法来写这篇文章。 @MichaelMuryn 是的,我单独运行了查询。它工作正常。它只返回与另一个选择查询具有相同行的一列。 【参考方案1】:

在你声明的这一部分

(SELECT  CAST(t1.salary_value AS float) / CAST(t.salary_value AS float)

演员要求 t1.salary 是一个单一的值。

但是这部分返回的不止一行。

       SELECT t.id_user
              , t.salary_value
              , row_number() OVER(PARTITION BY t.id_user ORDER BY t.salary_date ) AS rowrank
       FROM employee t) AS t
       INNER JOIN employee t1 ON t1.id_user = t.id_user
       WHERE t.rowrank = 1
       GROUP BY t1.id_user, t1.salary_value, t1.salary_date, t.salary_value, t.rowrank
       ORDER BY t1.id_user, t1.salary_date DESC

【讨论】:

我希望它返回不止一行..many rows infact。我将不得不使用另一个联接,是吗? 啊,是的,在这种情况下,您需要将该子选择转换为内联表并将其加入,然后执行计算。 但是如果我创建一个表并加入它,它会影响我以前在他们的组中的查询和排序等等 是的,恐怕没有办法。 1) 说,我加入了两个查询,哪一行显着增加? 2) 如果第一个查询返回 4 行,而我要加入的另一个查询返回 6,这有关系吗?区别重要吗?

以上是关于我在选择查询中有一个选择查询,该查询引发错误:“用作表达式的子查询返回的不止一行”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

选择要按查询组搜索的列

mysql的子查询中有统计语句 我该如何优化

Access查询中按不同列功能选择列

Oracle SQL 选择不同的查询以返回特定的行数

子查询 MYSQL 以从服务器中选择所有数据库

我无法将 SQL 选择查询结果转换为位