子查询返回更多值时如何插入表?

时间:2015-05-15 07:39:44

标签: sql-server

嗨我的箱子有一个Split函数,它返回像bellow:

这样的行
declare @a nvarchar(50)= '1,2,3,4,5,6'
select Item from dbo.Split(@a,',')

结果:

Item
--------
1
2
3
4
5
6

现在我想创建一个表并从我的split函数插入两个字段,如下所示:

declare @a nvarchar(50)= '1,2,3,4,5,6'
declare @b nvarchar(50)= '10,20,30,40,50,60'

declare @tblCare table
(
    id int , 
    count int
)

insert into @tblCare (id,count) 
values 
(
   (select Item from dbo.Split(@a,',')),
   (select Item from dbo.Split(@b,','))
)

select * from @tblCare

我得到了这个

  

错误:消息512,级别16,状态1,行10子查询返回更多   比1值。当子查询跟随=,!=时,不允许这样做,   &lt ;,< =,>,> =或者当子查询用作表达式时。该   声明已被终止。

id          count
----------- -----------

(0 row(s) affected)

以及我期望的结果:

id     count
---------------
1   10  
2   20
3   30
4   40
5   50
6   60

3 个答案:

答案 0 :(得分:4)

你可以这样做:

declare @t1 table (ID bigint identity(1, 1), Item nvarchar(max))
declare @t2 table (ID bigint identity(1, 1), Item nvarchar(max))

insert into @t1
select item from dbo.Split(@a,',')

insert into @t2
select item from dbo.Split(@b,',')      

insert into @tblCare (id,count)
select T1.Item, T2.Item
from @t1 as T1 
    inner join @t2 as T2 on T1.ID = T2.ID

首先,我创建带有标识列的表来枚举拆分数据的行。

然后使用这些rownumbers加入两个结果并插入它。

答案 1 :(得分:4)

您的dbo.Split函数应返回serial no,我们可以在其中加入两个分割。我使用的是Jeff Moden的DelimitedSplit8K,它是最快的分割器之一,但您可以使用ROW_NUMBER()更新分割功能以包含序列号。

declare @a nvarchar(50)= '1,2,3,4,5,6'
declare @b nvarchar(50)= '10,20,30,40,50,60'

insert into @tblCare (id,count)
SELECT a.item,b.item 
FROM [DelimitedSplit8K](@a,',')  a
INNER JOIN [DelimitedSplit8K](@b,',') b
ON a.itemnumber = b.itemnumber

<强>输出

1   10
2   20
3   30
4   40
5   50
6   60

答案 2 :(得分:0)

不要使用子查询,即插入语法形式:

insert into table ...
select ...

选择列的数量和类型与插入的列匹配。

我原以为你想要从所有回复项目的拆分调用计数:

insert into @tblCare (id, count) 
select item, count(*) from
(select item from dbo.Split(@a,',')
union all
select item from dbo.Split(@b,',')) x
group by item