Краткое описание соответствующей части домена:
A Категория состоит из четырех данных:
- Пол (Мужской/Женский)
- Возрастная дивизия (Могущественный клещ для мастера)
- Цвет пояса (от белого до черного)
- Подразделение по весу (от петуха до тяжелого)
Итак, Male Adult Black Rooster
образует одну категорию. Некоторые комбинации могут не существовать, например, могучий клещный пояс.
Спортсмен сражается с спортсменами той же категории, и если он классифицирует, он борется с спортсменами разных весовых дивизий (но одного пола, возраста и пояса).
К моделированию. У меня есть таблица Category
, уже заполненная всеми комбинациями, которые существуют в домене.
CREATE TABLE Category (
[Id] [int] IDENTITY(1,1) NOT NULL,
[AgeDivision_Id] [int] NULL,
[Gender] [int] NULL,
[BeltColor] [int] NULL,
[WeightDivision] [int] NULL
)
A CategorySet
и a CategorySet_Category
, который формирует отношение многих ко многим с Category
.
CREATE TABLE CategorySet (
[Id] [int] IDENTITY(1,1) NOT NULL,
[Championship_Id] [int] NOT NULL,
)
CREATE TABLE CategorySet_Category (
[CategorySet_Id] [int] NOT NULL,
[Category_Id] [int] NOT NULL
)
Учитывая следующий набор результатов:
| Options_Id | Championship_Id | AgeDivision_Id | BeltColor | Gender | WeightDivision |
|------------|-----------------|----------------|-----------|--------|----------------|
1. | 2963 | 422 | 15 | 7 | 0 | 0 |
2. | 2963 | 422 | 15 | 7 | 0 | 1 |
3. | 2963 | 422 | 15 | 7 | 0 | 2 |
4. | 2963 | 422 | 15 | 7 | 0 | 3 |
5. | 2964 | 422 | 15 | 8 | 0 | 0 |
6. | 2964 | 422 | 15 | 8 | 0 | 1 |
7. | 2964 | 422 | 15 | 8 | 0 | 2 |
8. | 2964 | 422 | 15 | 8 | 0 | 3 |
Поскольку спортсмены могут сражаться с двумя категориями, мне нужно CategorySet
и CategorySet_Category
записаться двумя разными способами (это могут быть два запроса):
Один Category_Set
для каждой строки, при этом один CategorySet_Category
указывает на соответствующий Category
.
Один Category_Set
, который группирует все WeightDivisions в одном CategorySet
в том же AgeDivision_Id, BeltColor, Gender. В этом примере изменяется только BeltColor
.
Таким образом, итоговый результат будет состоять из 10 строк CategorySet
:
| Id | Championship_Id |
|----|-----------------|
| 1 | 422 |
| 2 | 422 |
| 3 | 422 |
| 4 | 422 |
| 5 | 422 |
| 6 | 422 |
| 7 | 422 |
| 8 | 422 |
| 9 | 422 | /* groups different Weight Division for BeltColor 7 */
| 10 | 422 | /* groups different Weight Division for BeltColor 8 */
И CategorySet_Category
будет иметь 16 строк:
| CategorySet_Id | Category_Id |
|----------------|-------------|
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 9 | 1 | /* groups different Weight Division for BeltColor 7 */
| 9 | 2 | /* groups different Weight Division for BeltColor 7 */
| 9 | 3 | /* groups different Weight Division for BeltColor 7 */
| 9 | 4 | /* groups different Weight Division for BeltColor 7 */
| 10 | 5 | /* groups different Weight Division for BeltColor 8 */
| 10 | 6 | /* groups different Weight Division for BeltColor 8 */
| 10 | 7 | /* groups different Weight Division for BeltColor 8 */
| 10 | 8 | /* groups different Weight Division for BeltColor 8 */
Я понятия не имею, как вставить в CategorySet
, захватить его сгенерированный идентификатор, а затем использовать его для вставки в CategorySet_Category
Надеюсь, я сделал свои намерения ясными.
Я также создал SQLFiddle.
Изменить 1: Я прокомментировал в ответе Яцека, что это будет работать только один раз, но это ложь. Он будет работать пару раз в неделю. У меня есть возможность запускаться как команда SQL из С# или хранимой процедуры. Производительность не имеет решающего значения.
Изменить 2: Яцек предложил использовать SCOPE_IDENTITY
для возврата идентификатора. Проблема в том, что SCOPE_IDENTITY
возвращает только последний вставленный идентификатор, и я вставляю несколько строк в CategorySet
.
Изменить 3: Отвечать на @FutbolFan, который спросил, как извлекается FakeResultSet.
Это таблица CategoriesOption
(Id, Price_Id, MaxAthletesByTeam)
И таблицы CategoriesOptionBeltColor
, CategoriesOptionAgeDivision
, CategoriesOptionWeightDivison
, CategoriesOptionGender
. Эти четыре таблицы в основном одинаковы (Id, CategoriesOption_Id, Value).
Запрос выглядит следующим образом:
SELECT * FROM CategoriesOption co
LEFT JOIN CategoriesOptionAgeDivision ON
CategoriesOptionAgeDivision.CategoriesOption_Id = co.Id
LEFT JOIN CategoriesOptionBeltColor ON
CategoriesOptionBeltColor.CategoriesOption_Id = co.Id
LEFT JOIN CategoriesOptionGender ON
CategoriesOptionGender.CategoriesOption_Id = co.Id
LEFT JOIN CategoriesOptionWeightDivision ON
CategoriesOptionWeightDivision.CategoriesOption_Id = co.Id