2016-11-16 117 views
0

当我尝试运行具有多个SELECT语句插入语句,我得到错误子查询,而与多个SELECT语句

插入语句消息512,级别16,状态1,第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(); 

为什么我收到错误Subquery returned more than 1 value选择语句。但是insert语句对单个select语句正常工作。在这种情况下如何使用多个select语句? 我的要求是为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) 
); 
+0

问题是每一个你的子查询将获取所有的时间前20行数值t o插入第一行的一列,这是错误的方法 – Sagar

+0

你想保持fname/lname对吗? – jarlh

+0

第一个是你刚发明的语法。在TSQL中,这个(第一个)代码表示:具有两个标量值的元组,每个标量值都由子查询选择。 –

回答

4

您正在寻找此

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) 
+0

现在添加的附加信息:为fname和lname分开随机行,但不在一起。 – jarlh

+0

@jarlh - Updated ..但我认为如果添加样本数据和预期结果,答案可以得到改进 –

+0

如果ZZZ_FKP_NEW_PATIENT有100行,OP的最初尝试尝试插入20行。该查询将插入2000行。 – jarlh

0
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()) 
    ); 
+0

解释为什么这不应该引起与OP的尝试相同的错误? – jarlh

+0

获取错误'关键字'percent'附近的语法不正确。请确认。 – nischalinn

+0

@jarlh它将只返回单个值 –