Запрос таблицы объединения с полями в виде столбцов

StackOverflow https://stackoverflow.com/questions/18216

Вопрос

Я не совсем уверен, возможно ли это или относится к категории сводных таблиц, но я решил обратиться к профессионалам, чтобы посмотреть.

У меня есть три основные таблицы:Карточка, Имущество и CardProperty.Поскольку карточки не имеют одинаковых свойств и часто имеют несколько значений для одного и того же свойства, я решил использовать подход union table для хранения данных вместо того, чтобы иметь действительно большую структуру столбцов в моей карточной таблице.

Таблица свойств - это базовая таблица типов ключевых слов / значений.Итак, у вас есть ключевое слово ATK и присвоенное ему значение.Существует еще одно свойство, называемое SpecialType, для которого карта может иметь несколько значений, таких как "Sycnro" и "DARK".

Что я хотел бы сделать, так это создать представление или хранимую процедуру, которая дает мне идентификатор карты, имя карты и все ключевые слова свойств, назначенные карте в виде столбцов, и их значения в результирующем наборе для указанной карты.Поэтому в идеале у меня был бы результирующий набор, подобный:

ID  NAME                   SPECIALTYPE
1   Red Dragon Archfiend   Synchro
1   Red Dragon Archfiend   DARK
1   Red Dragon Archfiend   Effect

и я мог бы подсчитать свои результаты таким образом.

Я думаю, еще проще было бы просто объединить свойства вместе на основе их ключевого слова, чтобы я мог сгенерировать результирующий набор типа:

1  Red Dragon Archfiend   Synchro/DARK/Effect

.но я не знаю, возможно ли это.

Помоги мне stackoverflow Кеноби!Ты - моя единственная надежда.

Другие советы

Связанные, но значения - это значения, которые хранятся в отдельных столбцах, и вы уже давно знаете свои "особые типы":
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

Не сворачивайте с помощью конкатенации для хранения связанных записей в вашей базе данных.Это не совсем лучшая практика.

То, что вы описываете, - это сводная таблица.Сводные таблицы - это жесткий.Я бы посоветовал избегать их, если это вообще возможно.

Почему бы просто не прочитать связанные строки и не обработать их в памяти?Не похоже, что вы собираетесь потратить на это слишком много миллисекунд...

Один из вариантов заключается в том, чтобы свойства имели 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" с перечислением значений.

У меня есть тип / формат для моей таблицы свойств, таким образом, я знаю, как приводить / оценивать, когда я имею дело с целочисленным значением.Я не был уверен, имеет ли это отношение к данному вопросу или нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top