Sql 如何根据另一个表的单行在一个表中插入多行?
我有两个表,tr_testmodule和tr_moduleLocationTL 现在,我只需要一个查询,就可以将tr_testmodule的每一行的数据从tr_testmodule插入到tr_moduleLocationTL 例如,我想为单个moduleno插入许多行Sql 如何根据另一个表的单行在一个表中插入多行?,sql,sql-server,database,Sql,Sql Server,Database,我有两个表,tr_testmodule和tr_moduleLocationTL 现在,我只需要一个查询,就可以将tr_testmodule的每一行的数据从tr_testmodule插入到tr_moduleLocationTL 例如,我想为单个moduleno插入许多行 select * from TR_Modulelocationdtl --(nid is pk,nlocationo-int) nid nmoduleno nlocationno 1 1
select * from TR_Modulelocationdtl --(nid is pk,nlocationo-int)
nid nmoduleno nlocationno
1 1 3
2 1 65
3 1 6
4 1 9
5 1 63
6 2 13
7 2 625
我可以将这样的数据拆分为诱人的数据,但仅对于临时表中的一行,我可以将数据插入我的“TR_moduleLocationTL”
SELECT * INTO #TR_Modulelocationdtl FROM (SELECT data AS nLocationno FROM dbo.SplitString('1,23,2,3,5',',') ) AS nLocationno
select * from #TR_Modulelocationdtl
nLocationno
1
23
2
3
5
试试这个:
DECLARE @t TABLE ( n INT, v VARCHAR(100) )
INSERT INTO @t
VALUES ( 1, '3,65,6,9,63' ),
( 2, '13,625,62,91,613' )
SELECT n, s
FROM @t
CROSS APPLY ( SELECT Split.a.value('.', 'VARCHAR(100)') AS s
FROM ( SELECT CAST ('<M>' + REPLACE(v, ',','</M><M>')
+ '</M>' AS XML) AS s) AS A
CROSS APPLY s.nodes('/M') AS Split ( a )
) ca
这是一个相当容易用存储过程或匿名块解决的问题:循环遍历tru testmodule中当前的记录,拆分vlocationnno并循环遍历由此获得的位置,然后插入tru modulelocationdtl 我对SQL Server了解不够,所以这里有一个等效的Oracle脚本,可以用作伪代码。我想把它转换成SQL Server应该很容易
begin
for rec in (select * from tr_testmodule) loop
for loc in (select to_number(column_value) as nlocationno from xmltable(rec.vlocationnno)) loop
insert into tr_modulelocationdtl (nmoduleno, nlocationno)
values (rec.nmoduleno, loc.nlocationno);
end loop;
end loop;
delete from tr_testmodule;
commit;
end;
插入t1列1、列2、。。。选择可乐,可乐。。。从t2哪里…?现在我明白了,unpivot。好主意,因为逗号分隔的项很乱,只会引起很多问题——我想你已经注意到了。@jarlh你能用unpivot为我写一个查询吗?你在用哪个数据库管理系统?您可能需要特定于产品的功能。抱歉,我对SQL Server不太了解。因为我必须将其转换为SQL Server代码,我会在空闲时间进行转换,如果有任何查询,请通知您。
n s
1 3
1 65
1 6
1 9
1 63
2 13
2 625
2 62
2 91
2 613
begin
for rec in (select * from tr_testmodule) loop
for loc in (select to_number(column_value) as nlocationno from xmltable(rec.vlocationnno)) loop
insert into tr_modulelocationdtl (nmoduleno, nlocationno)
values (rec.nmoduleno, loc.nlocationno);
end loop;
end loop;
delete from tr_testmodule;
commit;
end;
insert into TR_Modulelocationdtl (nmoduleno,nlocationno,vlocationcode,dmodifyon)(
SELECT nmoduleno, nlocal,PlaceMst.vCityCode,GETDATE()
FROM tr_modulemst
CROSS APPLY ( SELECT Split.a.value('.', 'VARCHAR(100)') AS nlocal
FROM ( SELECT CAST ('<M>' + REPLACE(vlocationno, ',','</M><M>')
+ '</M>' AS XML) AS vlocationno) AS A
CROSS APPLY vlocationno.nodes('/M') AS Split ( a )
) ca
left join PlaceMst
on PlaceMst.nCityNo = nlocal
)