Một giải thích ngắn gọn trên một phần miền liên quan:Chèn vào nhiều bảng
A Thể loại bao gồm bốn dữ liệu:
- Giới tính (Nam/Nữ)
- Tuổi Division (Mighty Mite Sư Phụ)
- Belt màu (trắng to Black)
- trọng lượng Division (Dậu đến nặng)
Vì vậy, Male Adult Black Rooster
tạo thành một danh mục. Một số kết hợp có thể không tồn tại, chẳng hạn như vành đai đen mite hùng mạnh.
Một vận động viên chiến đấu vận động viên cùng thể loại, và nếu ông phân loại, ông chiến đấu vận động viên của các đơn vị trọng lượng khác nhau (nhưng cùng giới tính, tuổi tác và vành đai).
Để tạo mô hình. Tôi có một bảng Category
, đã được điền với tất cả các kết hợp tồn tại trong miền.
CREATE TABLE Category (
[Id] [int] IDENTITY(1,1) NOT NULL,
[AgeDivision_Id] [int] NULL,
[Gender] [int] NULL,
[BeltColor] [int] NULL,
[WeightDivision] [int] NULL
)
Một CategorySet
và CategorySet_Category
, mà tạo thành một nhiều mối quan hệ với 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
)
Với kết quả thiết lập sau đây:
| 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 |
Bởi vì các vận động viên có thể chống lại hai CategorySets, tôi cần CategorySet
và CategorySet_Category
trở nên thông dụng theo hai cách khác nhau (nó có thể được hai truy vấn):
Một Category_Set
cho mỗi hàng, với một CategorySet_Category
trỏ đến số Category
tương ứng.
Một Category_Set
nhóm tất cả các WeightDivisions trong một CategorySet
trong cùng một AgeDivision_Id, BeltColor, Giới tính. Trong ví dụ này, chỉ BeltColor
khác nhau.
Vì vậy, kết quả cuối cùng sẽ có tổng cộng 10 CategorySet
hàng:
| 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 */
Và CategorySet_Category
sẽ có 16 hàng:
| 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 */
Tôi không có ý tưởng làm thế nào để chèn vào CategorySet
, lấy nó Id được tạo, sau đó sử dụng nó để chèn vào CategorySet_Category
Tôi hy vọng tôi đã làm rõ ý định của mình .
Tôi cũng có created a SQLFiddle.
Chỉnh sửa 1: Tôi nhận xét trong câu trả lời của Jacek rằng điều này sẽ chỉ chạy một lần, nhưng điều này là sai. Nó sẽ chạy một vài lần một tuần. Tôi có tùy chọn để chạy như lệnh SQL từ C# hoặc một thủ tục được lưu trữ. Hiệu suất không quan trọng.
Chỉnh sửa 2: Jacek đề xuất sử dụng SCOPE_IDENTITY
để trả lại Id. Vấn đề là, SCOPE_IDENTITY
chỉ trả về Id được chèn cuối cùng và tôi chèn nhiều hàng vào CategorySet
.
Chỉnh sửa 3: Trả lời cho @FutbolFan, người đã hỏi cách lấy lại FakeResultSet.
Nó là một bảng CategoriesOption
(Id, Price_Id, MaxAthletesByTeam)
Và bảng CategoriesOptionBeltColor
, CategoriesOptionAgeDivision
, CategoriesOptionWeightDivison
, CategoriesOptionGender
. Bốn bảng đó về cơ bản giống nhau (Id, CategoriesOption_Id, Value).
Việc xem xét truy vấn như thế này:
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
Một câu hỏi: Tại sao bạn chỉ có 8 hàng trong 'fakeresultset' của bạn và chờ đợi 10 dòng khác nhau trong' bảng CategorySet' của bạn? Tôi không thể hoàn toàn theo logic đằng sau nó. – FutbolFan
@FutbolFan Như tôi đã nói, nó có thể là hai truy vấn. 1 'CategorySet' và 1' CategorySet_Category' cho mỗi hàng trong tập kết quả giả, tổng cộng 8 hàng. Và 1 'CategorySet' cho mỗi BeltColor, tạo thêm hai hàng nữa và 8 hàng khác của' CategorySet_Category' – Andre
@FutbolFan Có lẽ tôi có thể viết cái thứ hai nếu cái đầu tiên được cung cấp, mặc dù tôi thiếu kỹ năng trong SQL – Andre