Sql-Server

使用 SELECT INTO 從現有表建構橋表

  • January 14, 2018

我有一個大源表,其中屬性與度量混合在一起。我想用它們製作一個橋接表來分析數據。

問題(在我的例子中 N 實際上是 22,id_column 引用同一張表)

|id | id_column1 | id_column2 | id_columnN |  stuff |
+---+------------+------------+------------+--------|    
| 1 |     2017   |    2024    |    1452    |   red  |
| 2 |     4125   |    NULL    |    5234    |   blue |
| 3 |     NULL   |    5234    |    7234    |   pink | 

我只想從上面建構一個橋接表,但我不想以這種方式提取所有列,我的目標是有一些類似的東西:

|idT1| idT2 |
+----+------+    
| 1  | 2017 |
| 1  | 2024 |
| 1  | 1452 |
| 2  | 4125 |
| 2  | NULL |
| 2  | 5234 |

等等。我只想從上面問題中的數據建構這樣的橋接表,然後用足夠的表引用 idT1 和 idT2。

我的想法: - 使用數據透視表確實失敗了,因為我需要映射所有的 id 值。- 我正在考慮使用一些游標將所有結果映射到一個以 id 值為界的變數中,但它也對我不起作用。

提前感謝您的時間和幫助!

我建議您使用 WHILE 來使用迭代解決方案,而不是使用 CURSOR。

CREATE TABLE MEASURES (id int, id_column1 int, id_column2 int, id_column3 int, stuff varchar(20));
INSERT INTO MEASURES VALUES
(1, 2017, 2024, 1452, 'red'),
(2, 4125, NULL, 5234, 'blue'),
(3, NULL, 5234, 7234, 'pink');
GO
CREATE TABLE BRIDGE (id int, idc int);
GO
DECLARE @idColumn INT = 1;
DECLARE @cmd VARCHAR(MAX) = '';

WHILE @idColumn <= 3
BEGIN
    SET @CMD =   'INSERT INTO BRIDGE'
               + ' SELECT id, id_column' 
               + CAST(@idColumn AS VARCHAR(10))
               + ' FROM MEASURES'
               -- uncomment to remove NULL values
               --+ ' WHERE id_column'
               --+ + CAST(@idColumn AS VARCHAR(10))
               --+ ' IS NOT NULL;';

    EXEC (@CMD);

    SET @idColumn = @idColumn + 1;

    -- uncomment to check SQL statements 
    --SELECT @CMD;
END

SELECT * FROM BRIDGE ORDER BY id;
GO
編號 | 國際數據中心
-: | ---:
 1 | 2017
 1 | 2024
 1 | 1452
 2 | 5234
 2 | *空值*
 2 | 4125
 3 | *空值*
 3 | 5234
 3 | 7234

dbfiddle在這裡

引用自:https://dba.stackexchange.com/questions/195371