我正在尝试使用现有数据创建新数据,但在列中使用分隔值。我在 sql server 2014 vesrion 上运行它。这是我的桌子
create table #test ( ID INT , CODE VARCHAR(10) ,M_U VARCHAR(5) , M_C VARCHAR(5) ,SEPERATOR_A VARCHAR(5) ,CODE1 VARCHAR(10), M1_U VARCHAR(5) , M1_C VARCHAR(5) ,SEPERATOR_B VARCHAR(5) ,CODE2 VARCHAR(10), M2_U VARCHAR(5) , M2_C VARCHAR(5) ) INSERT INTO #TEST VALUES ( 123 , '1' ,'ABC' , 'XYZ', NULL, NULL , NULL ,NULL ,NULL, NULL ,NULL,NULL) ,( 456 , 'G4762' ,'D01' , '398', '^', 'G4765', 'E043' ,NULL ,NULL, NULL ,NULL,NULL) ,( 893 , 'H7832' ,'U73' , 'R12', '^', 'H9833', NULL ,'F82' ,'^', 'H563' ,'U83',NULL)
这是我期望的结果
任何帮助将不胜感激!!
正如@nbk 建议的那样,您不需要扫描表三次。
相反,您可以CROSS APPLY在引用表的外部引用时合并各个列。
CROSS APPLY
SELECT t.ID, v.* FROM #test t CROSS APPLY ( SELECT t.CODE, t.M_U, t.M_C, 1 WHERE t.CODE IS NOT NULL UNION ALL SELECT t.CODE1, t.M1_U, t.M1_C, 2 WHERE t.CODE1 IS NOT NULL UNION ALL SELECT t.CODE2, t.M2_U, t.M2_C, 3 WHERE t.CODE2 IS NOT NULL ) v(CODE, M_U, M_C, Line) ORDER BY t.ID, v.Line;
db<>fiddle,请注意我的版本只有一个表扫描。