Sql 使用三个源表的N到N关系

Sql 使用三个源表的N到N关系,sql,sql-server,database,Sql,Sql Server,Database,我是一名学生,我正在做一个项目,但我有一个问题,我无法解决。我有一个表,其中有从csv文件导入的行,一个表有事实(暴力),还有一个表有维度(类别-死亡和受伤)。在原始表(从csv文件导入)中,我得到了表描述,还有一些长字符串,它们的子字符串已失效或已损坏。现在我必须以某种方式将事实表与维度表联系起来,这取决于暴力的类别。我创建了另一个名为ViolenceCategories的表,通过ID连接这些表,但我不知道如何填充此表 结构: 表格FromCSV id, date, description,

我是一名学生,我正在做一个项目,但我有一个问题,我无法解决。我有一个表,其中有从csv文件导入的行,一个表有事实(暴力),还有一个表有维度(类别-死亡和受伤)。在原始表(从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 
表2类别

id, category  
1, shot  
2, injured 
idFact, idDim  
1,1  
2,2  
3,2  
3,1  
表3.暴力类别

id, category  
1, shot  
2, injured 
idFact, idDim  
1,1  
2,2  
3,2  
3,1  
如何填写表格类别

编辑 我已经创建了另一个表,用description分隔列的值

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

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

在SQL Server 2016及更新版本中,您可以使用表运算符
STRING\u 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     |
+----+------------+---------------------+----------+-------------+

将其转换为Insert语句以填充
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

问题在于您表中的列
说明
来自CSV
。它包含分隔的数据。您需要使用另一个表来管理多对多关系,从而使数据正常化。只是澄清一下,因为还不清楚,您想从CSV.Description
列中选取管道分隔字符串中的每个值,以建立表
暴力类别
中表格
暴力
DimCategories
之间的关系吗?不,我只需要死亡或受伤人员的信息。我将在几分钟内编辑我的帖子问题是,您需要在结果中包含两列,
desc1
desc2
。您的表格
FromCSV
说明
列中是否有3个分隔值?如果是这样的话,你对你的结果有什么期望?就像我说的,修改你的设计。不,有最多两个估值器,但也许我写的不明白。我不知道如何实现表格暴力类别,当我使用来自CSV表格的数据实现表格DIMCATEGORES和GUNBREACE时。我想我不明白你们所说的“实现”是什么意思。你是说“填充”吗。比如如何将insert语句从您的
fromscsv
写入您的
ViolenceCategories
?是的,对不起我的英语,我必须填写。我有两张表,一张是关于暴力的事实(身份证、日期和地址),第二张是维度(身份证和描述)。现在使用CSV表格中的数据,我想连接暴力id和维度id来描述是否有死亡或受伤人员。顺便说一句,谢谢你的帮助,这对我来说很有意义。我已经更新了我的答案,以包含我提供的SELECT后面的INSERT语句。我相信这就是你想要的。