【问题标题】:Subquery returned more than 1 value while inserting statement with multiple select statements插入具有多个选择语句的语句时,子查询返回超过 1 个值
【发布时间】:2016-11-16 10:56:48
【问题描述】:

当我尝试使用多个 select 语句运行插入语句时,出现错误

Msg 512, Level 16, State 1, Line 3 子查询返回超过 1 个 价值。当子查询跟在 =、!=、、>= 之后或当子查询用作表达式时,这是不允许的。声明已终止。

我的查询

insert into zzz_fkp_tbl2 (fname,lname) values
(
    (select top 20 percent [FNAME] from ZZZ_FKP_NEW_PATIENT order by newid())
    ,(select top 20 percent lname from ZZZ_FKP_NEW_PATIENT order by newid())
);

但是当我使用单个语句运行插入语句时,此查询运行成功,例如:

insert into zzz_fkp_tbl2 (lname)
select top 20 percent lname from ZZZ_FKP_NEW_PATIENT order by newid();

为什么我在使用多个 select 语句时收到错误 Subquery returned more than 1 value。但是插入语句与单个选择语句一起工作正常。在这种情况下如何使用多个选择语句? 我的要求是为 fname 和 lname 选择单独的随机行,但不能一起选择,即 fname 应该随机选择,lname 应该随机选择。

目标表

create table zzz_fkp_tbl2
(
    zzz_fkp_tbl2_id int identity(1,1) not null
    ,name varchar(200)
    ,fname varchar(200)
    ,lname varchar(200)
    ,gender int
    ,address int
    ,age varchar(10)
);

【问题讨论】:

  • 问题是每次您的子查询都会获取所有前 20 行值以插入到第一行的一个列中,这是错误的方法
  • 您想将 fname/lname 对放在一起吗?
  • 第一个是您刚刚发明的语法。在 TSQL 中,这个(第一个)代码意味着:两个标量值的元组,每个都由子查询选择。
  • 感谢 cmets。我的要求是为 fname 和 lname 选择单独的随机行,而不是一起选择。

标签: sql sql-server


【解决方案1】:

你正在寻找这个

INSERT INTO zzz_fkp_tbl2
            (fname,
             lname)
SELECT TOP 20 PERCENT [FNAME],
                      lname
FROM   ZZZ_FKP_NEW_PATIENT
ORDER  BY Newid() 

更新:

SELECT TOP 20 PERCENT a.FNAME,
                      b.lname
FROM   ZZZ_FKP_NEW_PATIENT
       OUTER apply (SELECT TOP 1 [FNAME] ZZZ_FKP_NEW_PATIENT
                    ORDER  BY Newid()) a ([FNAME])
       OUTER apply (SELECT TOP 1 lname ZZZ_FKP_NEW_PATIENT
                    ORDER  BY Newid()) b (lname) 

【讨论】:

  • 现在添加了附加信息:fname 和 lname 的随机行分开,但不在一起。
  • @jarlh - 已更新.. 但我认为如果添加示例数据和预期结果,答案可以得到改善
  • 如果 ZZZ_FKP_NEW_PATIENT 有 100 行,OP 的原始尝试尝试插入 20 行。此查询将插入 2000 行。
  • @jarlh - 是的。现已修复
【解决方案2】:
insert into zzz_fkp_tbl2 (fname,lname) values
    (
        (select top(1)  [FNAME] from ZZZ_FKP_NEW_PATIENT order by newid())
        ,(select top(1) lname from ZZZ_FKP_NEW_PATIENT order by newid())
    );

【讨论】:

  • 解释为什么这不应该引发与 OP 的尝试相同的错误?
  • 收到错误Incorrect syntax near the keyword 'percent'.。请验证。
  • @jarlh 它只会返回单个值
  • 请删除“20%”@nischalinn
猜你喜欢
  • 2012-06-07
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多