【问题标题】:insert multiple rows using subquery使用子查询插入多行
【发布时间】:2012-12-11 23:34:35
【问题描述】:
这是查询:
INSERT INTO qualification_lookup (variation, correct_qualification)
SELECT (SELECT Qualification FROM student WHERE Qualification like 'A%') ,'A-Level'
这是我尝试执行查询时遇到的错误。
消息 512,级别 16,状态 1,行 1 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。声明已终止。
如果有人告诉我任何替代方法,那么我是 SQL 新手。
【问题讨论】:
标签:
sql
sql-server
database
【解决方案1】:
INSERT INTO qualification_lookup (variation, correct_qualification)
select Qualification,'A-Level' from student where Qualification like 'A%'
【解决方案2】:
INSERT INTO qualification_lookup (variation, correct_qualification)
select Qualification, 'A-Level' from student where Qualification like 'A%'
语法是否正确
【解决方案3】:
您需要考虑如何构建查询 - 考虑一下如果您只运行此代码会得到什么:
SELECT (select Qualification from student where Qualification like 'A%') ,'A-Level'
你得到的确切错误将是我的猜测 - 你有一个试图与单个字符串匹配的许多资格的列表 - 'A-level'。
另一方面,这会很好用
select Qualification, 'A-Level' from student where Qualification like 'A%'
在我看来,INSERT 和 UPDATE 语句的诀窍是编写一个 SELECT 语句来满足您的需求,然后将其包装起来
INSERT INTO qualification_lookup (variation, correct_qualification) select Qualification, 'A-Level' from student where Qualification like 'A%'
【解决方案4】:
问题是这个子查询:
select Qualification from student where Qualification like 'A%'
返回几行。这就是您收到错误消息 512 的原因
不需要使用它。
这就够了:
INSERT INTO qualification_lookup (variation, correct_qualification)
select Qualification, 'A-Level' as correct_qualification
from student where Qualification like 'A%'
【解决方案5】:
declare @count int
declare @index int = 1
declare @currentQualificationId int = null
set @count = (select distinct count(QualificationId) from Qualification from where
Qualification like 'A%')
set @currentQualificationId = (SELECT QualificationId from (select QualificationId ,
ROW_NUMBER() OVER (ORDER BY QualificationId) AS RowNumber from Qualification where
Qualification like 'A%') as Qualification
where Qualification.RowNumber = @index)
while (@index <= @count)
begin
INSERT INTO qualification_lookup (variation, correct_qualification)
values((select Qualification where QualificationId =
@currentQualificationId),'A-Level')
set @index = @index + 1
set @currentQualificationId = (SELECT QualificationId from (select
QualificationId , ROW_NUMBER() OVER (ORDER BY QualificationId) AS RowNumber from
Qualification where Qualification like 'A%') as Qualification
where Qualification.RowNumber = @index)
END