首页 > 解决方案 > 将一行的不同字段的值按一定顺序插入到另一个表的一列中

问题描述

当我将表 T_EMP_MASTER 中的字段插入临时表时,它会按照 emp_id,emp_id2,emp_id3 的值顺序出现在 #temp_empdet 中。我希望按照插入顺序插入 emp_id,emp_id2,emp_id3 字段,例如

1. emp_id   
2. emp_id2   
3. emp_id3    

我怎样才能在这里做同样的事情,使用与联合相同的插入或使用其他任何东西?

 CREATE TABLE #TEMP_EMPDET
 (SN INT,EMP_ID INT)

 INSERT INTO #TEMP_EMPDET
 SELECT EMP_ID FROM T_EMP_MASTER WHERE CODE = @CODE
 UNION
 SELECT  EMP_ID2 FROM T_EMP_MASTER WHERE CODE = @CODE
 UNION
 SELECT  EMP_ID3 FROM T_EMP_MASTER WHERE CODE = @CODE

标签: sqltsql

解决方案


如果要保证插入顺序,请使用三个单独的语句:

INSERT INTO #TEMP_EMPDET (EMP_ID)
    SELECT EMP_ID FROM T_EMP_MASTER WHERE CODE = @CODE;

INSERT INTO #TEMP_EMPDET (EMP_ID)
    SELECT  EMP_ID2 FROM T_EMP_MASTER WHERE CODE = @CODE;

INSERT INTO #TEMP_EMPDET (EMP_ID)
    SELECT  EMP_ID3 FROM T_EMP_MASTER WHERE CODE = @CODE;

因为 SQL 表表示无序集,所以您只会在标识列中看到“排序”,或者如果EMP_ID是聚集键。

CREATE TABLE #TEMP_EMPDET (
    EMPDET_ID INT IDENTITY PRIMARY KEY,
    SN INT,
    EMP_ID INT
);

您的代码没有按顺序插入值,具体是因为UNION. 这消除了重复并重新排列数据。如果你想要那个功能,事情会变得有点复杂。我想我会推荐:

INSERT INTO #TEMP_EMPDET
    SELECT v.EMP_ID
    FROM T_EMP_MASTER EM CROSS APPLY
         (VALUES (1, EMP_ID), (2, EMP_ID2), (3, EMP_ID3)
         ) V(WHICH, EMP_ID)
    WHERE CODE = @CODE
    GROUP BY v.EMP_ID
    ORDER BY MIN(WHICH);

推荐阅读