查询以字段为列的联合表
-
09-06-2019 - |
题
我不太确定这是否可能,或者是否属于数据透视表的类别,但我想我应该去找专业人士看看。
我有三个基本表:卡、财产和卡财产。由于卡片不具有相同的属性,并且同一属性通常有多个值,因此我决定使用联合表方法来存储数据,而不是在卡片表中使用非常大的列结构。
属性表是基本的关键字/值类型表。这样您就有了关键字 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查询按月比较产品销量
否则,我将使用存储过程中的光标来执行此操作,或者在业务或表示层中执行转换。
如果您知道所有情况,请刺入 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
不要因数据库中相关记录的串联存储而崩溃。这不完全是最佳实践。
您所描述的是一个数据透视表。数据透视表是 难的. 。我建议尽可能避免使用它们。
为什么不直接读入相关行并在内存中处理它们呢?听起来你不会花太多毫秒来做这件事......
一种选择是让 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”。
我的属性表确实有一个类型/格式,这样我就知道在处理整数值时如何进行转换/评估。我不确定它是否与这个问题相关。