sql 问题子查询返回的值不止一个。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 问题子查询返回的值不止一个。相关的知识,希望对你有一定的参考价值。

子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。sql语句是这样的:
update aa set idcard = (select bb.idcard from bb
where exists (select * from aa where aa.name=bb.name ))
怎么改呢?就是想把bb表中的idcard放进aa表中。但是前提是aa表,bb表中有相同的名字。

解决方法如下:

返回一个值:返回多个说明数据库中满足用户查询条件的记录有多个,要返回一个就说明用户的查询条件不够,再加条件控制就行了,比如在语句末尾再加 and ***=‘***’;

如果用户问的是如何在后台程序中接收的话,用List可以,一个节点接收Result的一行值,读取的时候遍历List就行了。

扩展资料:

删除表

drop table tabname--这是将表连同表中信息一起删除但是日志文件中会有记录

删除信息

delete from table_name-这是将表中信息删除但是会保留这个表

最大:select max(field1) as maxvalue from table1

最小:select min(field1) as minvalue from table1[separator]

参考资料来源:百度百科-sql语句

参考资料来源:百度百科-SQL语句大全

参考技术A 这种语句在一种情况下可以执行,当子查询只能查出一条数据时。

如果查出多条,肯定会报错。【xxxxx子查询返回了多条数据】(报错信息大概就这个样子)

试想, aa表 name = '1'
bb表中存在2条数据:
一条 name = '1' idcard = '111'
另一条 name = '1' idcard ='222'
那数据库如何判断,是吧aa中name='1'的这条数据 update 成 111 还是222呢?

所以这种语句在逻辑上是存在缺陷的,除非你能保证子查询能查出1条数据。

祝进步,望采纳!追问

额。那这样就是没有办法实现了?

追答

不是实现不实现的问题。
只要逻辑正确,实现方式肯定是有的

现在一张aa表中的数据 对应 n个 bb表中的
你取那个值呢?第一个?还是怎么的?
如果是第一个那么

update aa set idcard = (select bb.idcard from bb
where exists (select to(1)idcard from aa where aa.name=bb.name )

top是sqlServer语法,oracle是rownum
数据库不同语法不同

追问

可是说aa表里的是不唯一的。name有重复idcard null
bb表里我保证了唯一性。name和idcard全是唯一的这样逻辑应该是对的!可是按上面的update还是不对。
我之后又试了把aa表和bb表完全对应上name和idcard全是唯一的可是还是不对。错误提示是子查询返回的值不止一个。当子查询跟随在 =、!=、、>= 之后,或子查询用作表达式时,这种情况是不允许的。

追答

update aa set idcard =

(select bb.idcard from bb where aa.name=bb.name )
仔细想下, 你的exists

怎么查都是多条数据

追问

那有其他办法实现我要的需求吗?同时更新把bb表中的idcard放进aa表中。但是前提是aa表,bb表中有相同的名字

本回答被提问者和网友采纳
参考技术B update aa set idcard = (select bb.idcard from bb
where exists (select * from aa where aa.name=bb.name ) and rownum= 1);

这样可以么?追问

不行啊

参考技术C 不行 update语句 set只能赋一个值 子查询是查询出的不只一个值

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

【中文标题】我在选择查询中有一个选择查询,该查询引发错误:“用作表达式的子查询返回的不止一行”[重复]【英文标题】: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,这有关系吗?区别重要吗?

以上是关于sql 问题子查询返回的值不止一个。的主要内容,如果未能解决你的问题,请参考以下文章

sql 子查询返回的值不止一个怎么解决?

sql提示子查询返回的值不止一个,求解如何修改,谢谢。

sqlserver 表 无法更新和删除 子查询返回的值不止一个

子查询返回的值不止一个.当子查询跟随在 =,!=,<,<=,>,>= 之后,或子查询用作

子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,不允许?

SQL之子查询