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

标签 sql sql-server pivot lookup-tables

我有一堆这样的表:

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... >_<

只为一个表编写此查询是可行的,但不是最好的,但我需要为另外 30 个相同大小的表展平这样的数据。呃...请提出建议?

我也很想知道我正在做的事情是否是常见的事情......?

我需要对统计软件的 SQL 数据进行非规范化/扁平化。

最佳答案

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

如果您使用的是 Microsoft SQL Server,则可以使用 PIVOT运算符(operator)来执行此操作。

其他品牌的 RDBMS 对此类查询的支持各不相同。最坏的情况是您必须使用动态 SQL 将查找表中的非常值硬编码到主表的联接中。当您有 122 个不同的值时,这是不切实际的。

另请参阅标记为 pivot 的问题或crosstab .

关于sql - 扁平化/反规范化 SQL 查找表的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1461489/

相关文章:

mysql - 打印存储过程中插入中使用的变量列表

sql-server - 有没有办法检索已在 MS SQL Server Management Studio 的事务中定义的现有保存点列表

asp.net - 当两个成员试图访问一条记录时如何锁定该记录?

php - Laravel 在其他专栏上同步

c# - 枢轴应用程序 (WP7) 中的动画控制

mysql - 如果表中的任何值不为空,则仅显示此非空值。否则只显示空值

mysql - 如何防止表中的重复记录插入忽略在这里不起作用

php - laravel 中的整数可为空的列

SQL Server - 创建为数据库中的所有表运行的单个触发器

sql-server - 将 MS Access 中的数据透视表转换为 SQL Server 中的数据透视表