Я не совсем уверен, возможно ли это, или подпадает под категорию сводных таблиц, но я решил, что пойду к профессионалам, чтобы посмотреть.
У меня есть три основных таблицы: Card, Property и CardProperty. Поскольку карточки не имеют одинаковых свойств и часто имеют несколько значений для одного и того же свойства, я решил использовать подход таблицы объединения для хранения данных вместо того, чтобы иметь действительно большую структуру столбцов в моей карточной таблице.
Таблица свойств является базовой таблицей ключевых слов / типов значений. Итак, у вас есть ключевое слово ATK и присвоенное ему значение. Есть еще одно свойство SpecialType, для которого карта может иметь несколько значений, например «Sycnro» и «DARK»
Я хотел бы создать представление или хранимую процедуру, которая дает мне идентификатор карты, имя карты и все ключевые слова свойств, назначенные карте в виде столбцов, и их значения в 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
..но я не знаю, возможно ли это
Помоги мне переполниться стеком Kenobi! Ты моя единственная надежда.
Это для сервера SQL?
Если да то
Конкатенация значений из нескольких строк в один столбец (2000)
Конкатенация значений из нескольких строк в один столбец (2005+)
Не сворачивайте путем объединения для хранения связанных записей в вашей базе данных. Это не совсем лучшие практики.
То, что вы описываете, это сводная таблица. Сводные таблицы жесткие . Я бы посоветовал избегать их, если это вообще возможно.
Почему бы просто не прочитать связанные строки и обработать их в памяти? Не похоже, что вы потратите на это слишком много миллисекунд ...
Один из вариантов заключается в том, чтобы свойства имели 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
У меня есть тип / формат для моей таблицы свойств, так что я знаю, как привести / оценить, когда я имею дело с целочисленным значением. Я не был уверен, имеет ли это отношение к этому вопросу или нет.