首页 > 解决方案 > 使用三个源表的 N 对 N 关系

问题描述

我是一名学生,我正在做一个项目,但我有一个问题,我无法解决。我有一张表,其中包含从 csv 文件导入的行,一张表包含事实(GunViolences)和一张表(类别 - 死亡和受伤)。在原始表(从 csv 文件导入)中,我有表描述,并且有长字符串,其中的子字符串死亡或受伤。现在我必须以某种方式将事实表与维度表联系起来,具体取决于暴力类别。我创建了另一个名为 ViolenceCategories 的表来通过 ID 连接这些表,但我不知道如何填写此表。

结构:

表 FromCSV

id, date, description, address  
1,12-01-2002, Shot|shotgun, address1  
2,19-04-2003, injured, address2  
3, 21-10-2004, shot|injured, address3  

桌枪暴力

id, date, address  
1, 12-01-2002, address1  
2,19-04-2003, address2  
3, 21-10-2004, address3 

表 DimCategories

id, category  
1, shot  
2, injured 

餐桌暴力分类

idFact, idDim  
1,1  
2,2  
3,2  
3,1  

如何填写表格 VIolenceCategories?

编辑我创建了另一个表来分隔列的值和描述

表尺寸说明

id, desc1, desc2
1, Shot, shotgun
2, injured, null
3, shot, injured

标签: sqlsql-serverdatabase

解决方案


在 SQL Server 2016 及更高版本中,您可以使用表运算符STRING_SPLIT()来实现此目的。该函数会将记录中的分隔字符串拆分为每个子字符串的新行。考虑:

SELECT *
FROM FromCSV
    CROSS APPLY STRING_SPLIT(description, '|') AS descriptions


+----+------------+---------------------+----------+-------------+
| id |    date    |     description     | address  |    value    |
+----+------------+---------------------+----------+-------------+
|  1 | 12-01-2002 | Shot|shotgun        | address1 | Shot        |
|  1 | 12-01-2002 | Shot|shotgun        | address1 | shotgun     |
|  2 | 19-04-2003 | three shots|injured | address2 | three shots |
|  2 | 19-04-2003 | three shots|injured | address2 | injured     |
|  3 | 21-10-2004 | shot|injured        | address3 | shot        |
|  3 | 21-10-2004 | shot|injured        | address3 | injured     |
+----+------------+---------------------+----------+-------------+

SQLFiddle在这里

把它变成一个插入语句来填充你的ViolenceCategories表看起来像:

INSERT INTO ViolenceCategories
SELECT t1.id, t2.id
FROM
(
    SELECT id, value
    FROM FromCSV
        CROSS APPLY STRING_SPLIT(description, '|') AS descriptions
) t1
INNER JOIN DimCategories t2 ON t1.value = t2.category

SQLFiddle在这里


推荐阅读