【问题标题】:Best way to flatten/denormalize SQL lookup tables?扁平化/非规范化 SQL 查找表的最佳方法?
【发布时间】:2010-11-30 11:53:22
【问题描述】:

我有一堆这样的表:

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 数据进行非规范化/扁平化。

【问题讨论】:

  • 请描述您使用的数据库。
  • +1 感谢您在 Stackoverflow 上成为一个理智的人

标签: sql sql-server pivot lookup-tables


【解决方案1】:

您需要的是交叉表查询。

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

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

另请参阅标记为 pivotcrosstab 的 SO 问题。

【讨论】:

    【解决方案2】:

    使用数据透视表Here - Microsofthere - tutorial

    您需要指定所有列。但是你可以使用sp_executesql命令来使用动态SQL。

    【讨论】:

      【解决方案3】:

      如何在 INSERT AND UPDATE、DELETE 上使用触发器,以便这些非规范化表被填满...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-26
        • 2012-12-31
        • 2013-11-21
        • 2010-11-09
        • 2017-02-13
        • 2014-10-03
        • 1970-01-01
        相关资源
        最近更新 更多