Sql 插入包含多个select语句的语句时,子查询返回了多个值

Sql 插入包含多个select语句的语句时,子查询返回了多个值,sql,sql-server,Sql,Sql Server,当我尝试使用多个select语句运行insert语句时,我遇到了一个错误 Msg 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

当我尝试使用多个select语句运行insert语句时,我遇到了一个错误

Msg 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语句时,该查询运行成功,如下所示:

insert into zzz_fkp_tbl2 (lname)
select top 20 percent lname from ZZZ_FKP_NEW_PATIENT order by newid();
为什么在使用多个select语句时,子查询返回了超过1个值。但是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)
);

你在找这个吗

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) 

你在找这个吗

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) 


问题是,每次子查询都会获取前20行的所有值以插入到第一行的一列中,这是错误的方法是否要将fname/lname对保持在一起?第一个是您刚刚发明的语法。在TSQL中,这(第一个)代码的意思是:两个标量值的元组,每个值由子查询选择。感谢您的评论。我的要求是为fname和lname选择单独的随机行,但不能同时选择。问题是每次子查询都会获取前20行的所有值,以插入到第一行的一列中,这是错误的方法。是否要将fname/lname对保持在一起?第一个是您刚刚发明的语法。在TSQL中,这(第一个)代码的意思是:两个标量值的元组,每个值由子查询选择。感谢您的评论。我的要求是为fname和lname选择单独的随机行,但不能同时选择。现在添加的其他信息:为fname和lname选择单独的随机行,但不能同时选择。@jarlh-Updated。。但我认为,若样本数据和预期结果是相加的,那个么答案可以得到改进。若ZZZ_FKP_NEW_患者有100行,OP最初的尝试是插入20行。此查询将插入2000行。@jarlh-yesp。现在修复了现在添加的其他信息:fname和lname的随机行分开,但不能在一起。@jarlh-Updated。。但我认为,若样本数据和预期结果是相加的,那个么答案可以得到改进。若ZZZ_FKP_NEW_患者有100行,OP最初的尝试是插入20行。此查询将插入2000行。@jarlh-yesp。立即修复解释为什么这不会引发与OP尝试相同的错误?在关键字“百分比”附近获取错误
语法不正确。
。请验证。@jarlh它将只返回一个值。请删除“20%”@nischalinn解释为什么这不会引发与OP的尝试相同的错误?在关键字“百分比”附近获取错误
语法不正确。
。请验证。@jarlh它将只返回单个值请删除“20%”@nischalinn