查询以字段为列的联合表

时间:2020-03-05 18:41:09  来源:igfitidea点击:

我不确定这是否可行,还是属于数据透视表类别,但我认为我会去找专家看。

我有三个基本表: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!你是我唯一的希望。

解决方案

回答

不要因串联而崩溃以在数据库中存储相关记录。它不完全是最佳做法。

我们要描述的是数据透视表。数据透视表很难。我建议尽可能避免使用它们。

为什么不只读相关行并在内存中处理它们呢?听起来这并不会花费太多毫秒...

回答

这是用于SQL Server吗?

如果是的话

将多行中的值连接成一列(2000)
将多行中的值串联成一列(2005年以来)

回答

一种选择是使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"。

回答

相关但值是值保存在不同的列中,并且我们早就知道"特殊类型":
SQL查询按月比较产品销售

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

如果我们知道所有情况,请在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

回答

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