Краткое объяснение на соответствующей части домена:Вставка в несколько таблиц
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
)
CategorySet
и 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 |
Поскольку спортсмены могут бороться два CategorySets, мне нужно 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
, захватить его сгенерированный Id, затем используйте его для вставки в CategorySet_Category
Надеюсь, я сделал свои намерения ясными ,
У меня также created a SQLFiddle.
Редактировать 1: Я прокомментировал ответ Яцека, что это будет работать только один раз, но это неверно. Он будет работать пару раз в неделю. У меня есть возможность запускаться как команда SQL из C# или хранимой процедуры. Производительность не имеет решающего значения.
Редактировать 2: Jacek предложил использовать SCOPE_IDENTITY
, чтобы вернуть Id. Проблема в том, что 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
Один вопрос: Каким образом у вас есть только 8 строк в вашем файле 'fakeresultset' и ожидает 10 различных строк в вашем файле' CategorySet' таблицы? Я не мог полностью следовать логике этого. – FutbolFan
@FutbolFan Как я уже сказал, это могут быть два запроса. 1 'CategorySet' и 1' CategorySet_Category' для каждой строки в поддельном наборе результатов, всего 8 строк. И 1 'CategorySet' для каждого BeltColor, делая еще два из них и еще 8 строк' CategorySet_Category' – Andre
@FutbolFan Возможно, я могу написать второй, если первый предоставлен, несмотря на отсутствие навыков в SQL – Andre