0
我有包括通過另一項複雜的自連接返回正確的結果的情況。我期望做的是創建一個Ms SQL Server(2008)視圖來呈現數據。
這種情況涉及在一個持有產品庫存的鏈條內的個別公司,然後可以選擇與其所屬鏈條內的其他公司共享該庫存。規則如下:
- 如果一家公司擁有產品的股票和他們分享這些股票,然後提供給他們的數量是他們的庫存加上來自公司自己的連鎖
- 內的任何共享的股票如果一家公司持有產品的庫存,但他們沒有共享該庫存,則可供其使用的數量僅限於庫存
- 如果公司沒有持有庫存,那麼他們只能從其鏈中的其他公司分享庫存他們有
個表
Create Table dbo.Chain(
ChainId int Identity(1,1) Not Null PRIMARY KEY,
Name nvarchar(255) Not Null)
Go
Insert into Chain(Name)Values('Technology Brothers')
Insert into Chain(Name)Values('Kings Of Tech')
Go
Create Table dbo.Company(
CompanyId int Identity(1,1) Not Null PRIMARY KEY,
Name nvarchar(255) Not Null,
ChainId int Not Null)
Go
Insert into Company(Name, ChainId)Values('Techies', 1)
Insert into Company(Name, ChainId)Values('MotherboardsRUs', 1)
Insert into Company(Name, ChainId)Values('RAM Bros', 1)
Insert into Company(Name, ChainId)Values('Silicon Station', 2)
Insert into Company(Name, ChainId)Values('Nerd Place', 2)
Go
Create Table dbo.Product(
ProductId int Identity(1,1) Not Null PRIMARY KEY,
Name nvarchar(255) Not Null)
Go
Insert into Product(Name)Values('Laser Mouse')
Insert into Product(Name)Values('MBoard 101')
Insert into Product(Name)Values('CAT Cable')
Insert into Product(Name)Values('Big Screen')
Insert into Product(Name)Values('J Speakers')
Insert into Product(Name)Values('Blue USB')
Create Table CompanyProduct(
CompanyProductId int Identity(1,1) Not Null PRIMARY KEY,
CompanyId int,
ProductId int,
Quantity int,
IsShared bit)
Go
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(1, 1, 10, 1)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(1, 2, 1, 1)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(1, 3, 5, 0)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(1, 4, 2, 1)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(2, 1, 5, 1)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(2, 2, 10, 0)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(3, 3, 1, 1)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(3, 4, 4, 1)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(3, 5, 10, 1)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(4, 1, 5, 1)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(4, 3, 10, 0)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(5, 2, 2, 1)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(5, 4, 10, 1)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(5, 5, 3, 0)
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(5, 6, 8, 0)
Go
預期結果
結果應當包括對每個公司的每個產品一行那裏是提供給他們的數量。換句話說,如果他們沒有任何股票,並且他們的連鎖店裏沒有人分享任何股票,那麼該產品就不會有行。否則,將會有一行,包括它們擁有的數量,與它們共享的數量以及它們可用的總數量。
下表列出了上面插入的數據的結果。
CompanyId ChainId ProductId IsShared My Quantity Shared Quantity Total Quantity
1 1 1 1 10 5 15
1 1 2 1 1 0 1
1 1 3 0 5 NULL 5
1 1 4 1 2 4 6
1 1 5 NULL 0 10 10
2 1 1 1 10 5 15
2 1 2 0 10 NULL 10
2 1 3 NULL 0 1 1
2 1 4 NULL 0 6 6
2 1 5 NULL 0 10 10
3 1 1 NULL 0 15 15
3 1 2 NULL 0 1 1
3 1 3 1 1 0 1
3 1 4 1 4 2 6
3 1 5 1 10 0 10
4 2 1 1 5 0 5
4 2 2 1 0 2 2
4 2 3 0 10 NULL 10
4 2 4 NULL 0 10 10
5 2 1 NULL 0 5 5
5 2 2 1 2 0 2
5 2 4 1 10 0 10
5 2 5 0 3 NULL 3
5 2 6 0 8 NULL 8