关于相关领域部分的简要说明:
一个类别由四个数据组成:
- 性别(男/女)
- 年龄段(小童到大师)
- 带色(白带到黑带)
- 体重级别(雏鸡到重量级)
因此,“男性成年人黑色雏鸡”形成一个类别。有些组合可能不存在,比如小童黑带。
运动员与同一类别的运动员比赛,如果他晋级,他将与不同体重级别但相同性别,年龄和带色的其他运动员进行比赛。
进入建模。我有一个已经填充了该领域中所有可能存在的组合的“类别”表。
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 |
因为运动员可能会比赛两个类别集,所以我需要以两种不同的方式填充CategorySet
和CategorySet_Category
(可以是两个查询):一行一个
Category_Set
,一个CategorySet_Category
指向相应的Category
。一个
Category_Set
将相同年龄组、腰带颜色和性别的所有重量级别分组在一个CategorySet
中。在这个例子中,只有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
中。
我希望我已经表达清楚了我的意图。
我还创建了一个SQLFiddle。
编辑1:我在Jacek的答案中评论说这只会运行一次,但这是错误的。它每周会运行几次。我可以选择从C#运行作为SQL命令或存储过程。性能并不重要。
编辑2:Jacek建议使用SCOPE_IDENTITY
返回Id。问题是,SCOPE_IDENTITY
仅返回最后插入的Id,并且我会在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
CategorySet
和1个CategorySet_Category
,总共有8行。对于每个BeltColor,还有1个CategorySet
,因此需要两个,以及8个CategorySet_Category
行。 - Ortiga