Я разработал таблицу EAV, которая выглядит так:
SID AID VID
1 1 1
1 2 1
1 3 2
1 4 3
1 1 2
SID означает идентификатор субъекта, AID означает идентификатор атрибута, а VID означает ValuedID.
также таблица для сопоставления атрибутов:
AttributeID AttributeName
1 Hobbies
2 Name
3 Gender
4 IrisColor
После использования сводки для первой таблицы, связанной с таблицей атрибутов:
SELECT
SubjectID,
Hobbies,
Name,
Gender,
IrisColor
FROM
(
SELECT SubjectID, attr.AttributeName as attribute, ValueID from SubjectDetails, SubjectAttributes as attr WHERE SubjectDetails.AttributeID=attr.ID
) as t
PIVOT(
MAX(ValueID)
FOR attribute IN (Hobbies,Name,Gender,IrisColor)) AS t1
WHERE SubjectID=1
Я получаю это:
SubjectID Hobbies Name Gender IrisColor
1 1 1 2 3
Это почти правильно, но SubjectAttribute 1 (то есть хобби) появляется еще раз в первой таблице (SubjectDetails), поэтому я хочу добиться следующего:
SubjectID Hobbies Name Gender IrisColor
1 **1,2** 1 2 3
Я должен упомянуть, что меня не волнует, какой разделитель используется, и что я пытался сделать это с помощью функции STUFF, но сложно сочетать PIVOT и STUFF (или я просто не знаю, как это сделать). Любые предложения?