【发布时间】:2017-02-27 10:57:41
【问题描述】:
根据我之前的问题,我有以下表格:
IrisColor
ID Description
1 Blue
2 Gray
3 Green
4 Brown
SkinColor
ID Description
1 White
2 Asian
3 Dark
Gender
ID Description
1 Male
2 Female
还有属性表
Attributes
ID Description
1 SkinColor
2 IrisColor
3 Gender
还有 EAV 表:
PersonDetails
PersonID AttributeID ValueID
121 1 1
121 2 2
121 3 1
122 1 2
122 2 1
122 3 1
因此,如果我想选择名称、属性名称和仅为 SkinColor 的值,我会这样做:
SELECT p.Name,
a.Description,
v.Description
FROM PersonDetails AS sd
INNER JOIN Subjects AS p ON sd.PersonID=p.ID
INNER JOIN SubjectAttributes AS a ON sd.AttributeID=a.ID
INNER JOIN SkinColor AS v ON sd.ValueID= v.ID
但是如果我想从数据库中选择所有人的所有信息,不仅是肤色,还有虹膜颜色和性别,我该怎么办?
以前我知道我想从 SkinColor 中选择那个值,但在 PersonDetails 中我也有 IrisColor 和 Gender 的值。
INNER JOIN SkinColor AS v ON sd.ValueID= v.ID 这将不再适用。如何用更动态的东西代替它?
更新:
我用了这个说法:
SELECT
SubjectID,
SkinColor,
IrisColor,
EyeLidFlisure,
KnownEyeDeffect,
Ethnicity,
Height,
DrivingLicense,
Gender
FROM
(
SELECT SubjectID, attr.Description as attribute, ValueID from SubjectDetails, SubjectAttributes as attr WHERE SubjectDetails.AttributeID=attr.ID
) as t
PIVOT(MAX(ValueID) FOR attribute IN (SkinColor,IrisColor,Gender,EyeLidFlisure,KnownEyeDeffect,Ethnicity,Height,DrivingLicense)) AS t1
现在,我在单独的列中列出了所有属性,但我有值 ID,而不是值描述。我应该如何继续?
【问题讨论】:
-
将 EAV 转入常规表 PersonDetailsT(PersonID,SkinColor,IrisColor , Gender ...) 并将其加入适当的表。 Pivot 是特定于 DBMS 的,请正确标记 DBMS。
-
您能更具体地谈谈加入部分吗?因为这正是我现在的问题。
-
你的 DBMS 是什么?
-
SQL Express + Microsoft sql server 管理工作室
-
为什么要将属性存储在单独的表中?这似乎是 EAV 模型的一个奇怪实现。通常这些值直接进入表格?
标签: sql database attributes sql-server-express entity-attribute-value