Сведения о вопросе

Faridun

04:32, 23rd August, 2020

Теги

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

Просмотров: 406   Ответов: 5

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

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

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

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

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

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

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

1  Red Dragon Archfiend   Synchro/DARK/Effect
..

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

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



  Сведения об ответе

ITSME

23:35, 19th August, 2020

Связанные но значения значения хранятся в отдельных столбцах и вы знаете свой "special types" голова времени:
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


  Сведения об ответе

SILA

07:54, 6th August, 2020

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

То, что вы описываете-это таблица pivot. Pivot таблицами сложно . Я бы посоветовал избегать их, если это вообще возможно.

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


  Сведения об ответе

pumpa

00:06, 16th August, 2020

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


  Сведения об ответе

prince

14:30, 17th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться