sql - 有没有办法将 SQL 中的表“展开”为多个规范化表?(SQL 服务器)
问题描述
我有一些由 SQL XML 查询生成的数据,该查询使用一个交叉应用和一个外部应用创建以下形式的表:
COL 1 | COL 2 | COL 3
abe | dog | ball
abe | dog | stick
abe | cat | yarn
ben | cow | NULL
ben | dog | water
ben | dog | stick
在这个例子中,第 1 列是人,第 2 列是他们的宠物,第 3 列是他们的宠物喜欢的东西的列表(宠物可能不喜欢任何东西)。实际上,第 1,2 和 3 列分别由多列表示。
我想将这些数据“展开”成 3 个表,即人、宠物和宠物兴趣。在这样做时,我还想创建从宠物到人的多对一关系以及从 pet_interests 到宠物的多对一关系。
如果不使用 C# 手动迭代数据,我无法找到一种方法,但我觉得必须有一种更简单的方法。我希望有人能够以最好的方式帮助我。
提前致谢。
解决方案
我将展示这种方法。首先,创建引用表:
select identity(1, 1) as personId, col1 as name
into persons
from t
group by name;
对其余的表重复此操作。
然后为您的 1-1 表使用参考表:
select identity(1, 1) as personPetId, p.personId, pe.petId
into personPets
from t join
persons p
on t.col1 = p.name join
pets pe
on t.col2 = pe.species
group by col1, col2;
根据需要重复。
推荐阅读
- sql-server - 对每一行执行不同的查询
- less - 可以替换其他混合中使用的混合吗?
- html - 将图标移动到输入 html 的末尾
- string - 使 String.Contains() 不区分大小写
- ios - 从 iOS 11 中的应用生成 UITouch 事件
- html - 将数字流转换为音频
- linux - shebang 无法在 linux 中运行 bash 脚本
- amazon-web-services - AWS EC2 的 SSH 问题 - 权限被拒绝:公钥
- php - 无法抓取页面上的所有数据,因为 Js 脚本会在您向下滚动时添加数据
- selenium - 使用带有 Artifactory 的 webdrivermanager.properties 文件