查询以字段为列的联合表

时间:2008-08-20 15:23:02

标签: sql database-design stored-procedures

我不太确定这是否可行,或属于数据透视表类别,但我想我会去专业人士看看。

我有三个基本表:Card,Property和CardProperty。由于卡不具有相同的属性,并且通常具有相同属性的多个值,因此我决定使用联合表方法来存储数据,而不是在我的卡表中具有非常大的列结构。

属性表是基本的关键字/值类型表。所以你有关键字ATK和分配给它的值。还有另一个名为SpecialType的属性,卡可以有多个值,例如“Sycnro”和“DARK”

我想要做的是创建一个视图或存储过程,它为卡片ID,卡片名称和分配给卡片的所有属性关键字提供了指定卡片的ResultSet中的列及其值。理想情况下,我的结果集如下:

ID  NAME                   SPECIALTYPE
1   Red Dragon Archfiend   Synchro
1   Red Dragon Archfiend   DARK
1   Red Dragon Archfiend   Effect

我可以这样计算我的结果。

我想甚至更简单的是根据关键字简单地将属性连接在一起,所以我可以生成一个ResultSet,如:

1  Red Dragon Archfiend   Synchro/DARK/Effect

..但我不知道这是否可行。

帮我stackoverflow Kenobi!你是我唯一的希望。

5 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

相关但值是值保存在不同的列中,并且您知道您的“特殊类型”是时间的一部分:
SQL query to compare product sales by month

否则我会在存储过程中使用游标执行此操作,或在业务或表示层中执行转换。

如果您知道所有情况,请搜索sql:

Select
    ID,NAME
    ,Synchro+DARK+Effect --  add a some substring logic to trim any trailing /'s
from
    (select
        ID
        ,NAME
        --may need to replace max() with min().
        ,MAX(CASE SPECIALTYPE WHEN "Synchro" THEN SPECIALTYPE +"/" ELSE "" END) Synchro
        ,MAX(CASE SPECIALTYPE WHEN "DARK" THEN SPECIALTYPE +"/" ELSE "" END) DARK
        ,MAX(CASE SPECIALTYPE WHEN "Effect" THEN SPECIALTYPE ELSE "" END) Effect
    from
        table
    group by
       ID
       ,NAME) sub1

答案 2 :(得分:0)

不要通过连接来折叠以存储数据库中的相关记录。这不是最佳做法。

您所描述的是数据透视表。数据透视表是 hard 。我建议尽可能避免使用它们。

为什么不直接读入相关的行并在内存中处理它们?听起来你不会花太多毫秒来做这件事......

答案 3 :(得分:0)

一个选项是让Properties具有PropertyType,所以:

table cards
integer ID | string name | ... (other properties common to all Cards)

table property_types
integer ID | string name | string format | ... (possibly validations)

table properties
integer ID | integer property_type_id | string name | string value
foreign key property_type_id references property_types.ID

table cards_properties
integer ID | integer card_id | integer property_id
foreign key card_id references cards.ID
foreign key property_id references propertiess.ID

这样,当您想要设置新的属性值时,可以按其类型对其进行验证。一种类型可以是带有枚举值的“SpecialType”。

答案 4 :(得分:0)

我的属性表有一个类型/格式,这样我知道如何在处理整数值时进行转换/求值。我不确定这是否与这个问题有关。