Sql 如何根据另一个表的单行在一个表中插入多行?

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

我有两个表,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             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
                    )