当前位置: 首页 > 面试题库 >

展平/反规范化SQL查找表的最佳方法?

常英毅
2023-03-14
问题内容

我有一堆这样的表:

Lookup_HealthCheckupRisks
------------
ID  Name
1   Anemia
2   Anorexic
3   Bulemic
4   Depression
...
122   Syphilis



PatientRisksOnCheckup
------------------
ID CheckupID RiskID
1  11        2
2  11        3
3  12        1
4  14        1
5  14        3
...

但是我需要一个扁平化的版本,像这样:

PatientCheckup
------------------
CheckupID Risk_1 Risk_2 Risk_3 Risk_4 .. Risk_122
11        0      1      1      0         0
12        1      0      0      0         0
13        0      0      0      0         0
14        1      0      1      0         0

我不知道如何执行此操作,我能想到的最好的办法是编写一个临时表,定义所有122列,然后执行If Exists ( SELECT * FROM PatientRisksOnCheckup where RiskID=i and checkupID=j ) INSERT INTO PatientCheckup (1) WHERE CheckupID=j并遍历i, j...> _ <

只为一个表编写此查询不是最好的方法,但是我需要像这样为另外三十个相同大小的表展平数据。嗯…有什么建议吗?

我也很想知道我在做什么是否是一件普通的事情…?

我需要对统计软件的SQL数据进行归一化/展平。


问题答案:

您所需要的称为交叉表查询。

如果您使用的是Microsoft SQL Server,则可以使用PIVOT运算符进行操作。

其他品牌的RDBMS对这种类型的查询有不同的支持。最糟糕的情况是,您将不得不使用动态SQL将非常有价值的值从查找表硬编码到主表的联接中。当您有122个不同的值时,这是不切实际的。



 类似资料:
  • 我有一个名为内容的实体类型。 实体类型具有一对一关系。 SurveyData 实体实际上是一个映射的超类。它最终将有几十个用于存储来自不同调查数据的实体子类。 根据文档,我创建了一个自定义规范化器,它基于键处理非规范化: 有了这个,我可以完美地创建一个嵌入了SurveyData的新提交。下面是我发送给POST请求的JSON示例: 但是,当我通过 GET 获取集合或单个提交实体时,API 平台返回的

  • 将上面SELECT的输出(id)传递给DELETE 提前谢了。

  • 问题内容: 所以我有一个清单,我想获得。 我当然可以使用两个嵌套循环来执行此操作,但是必须有更好的方法吗?如果我能提供一个数字的话,本来可以解决的。 两个约束: 它应该在2.7中工作(但是出于好奇,我对3.x解决方案感兴趣) 列表元素应该是独立副本(它们是可变类型) 问题答案: 最终我想到了:

  • 问题内容: 假设我有一个客户表: 此表也 没有 主键。但是,并且对于任何给定都 应该 是唯一的。 该表包含许多重复的客户并不少见。为了避免重复,使用以下查询仅隔离唯一的客户: 幸运的是,该表格传统上包含准确的数据。也就是说,从来没有任何冲突或任何冲突。但是,假设有冲突的数据确实将其放入表中。我希望编写一个将失败的查询,而不是为有问题的查询返回多行。 例如,我尝试此查询没有成功: 有没有办法使用标准

  • 游戏创建规范 游戏上线前你需要提供软件著作权、版号申请证明(若涉及支付道具功能)、回执或者受理截图;如果游戏软件著作权有对外授权的,你需要向腾讯提供完整、真实、有效的授权文件,如果授权方允许多个主体同时提交、运营游戏,腾讯以先提交者为准。 如果你需要创建游戏,请根据游戏具体情况选择1~3种游戏类型。 游戏每次更新的玩法需要同步在游戏更新说明中写明; 游戏包控制在5M以内,最大不超过10M; 道具和

  • 问题内容: 在向我显示重复项之前,请注意,我已经在网站上进行搜索,发现了 一些 示例,但并非完全针对我的问题:) 在SQL中创建 友谊 表的最佳方法是什么,但是要确保每行都是唯一的,因为无论它们属于哪一列,相同的UserID和FriendID都不会被允许? 我有这个粗略的例子 并有2个外键,分别来自UserID和FriendID。 不过目前,我可以在用户之间插入 两次 Friendship ,从而