【发布时间】:2016-12-25 00:43:38
【问题描述】:
场景
我有一个场景,它涉及通过另一个复杂的自连接来返回正确的结果。我要做的是创建一个 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
【问题讨论】:
标签: sql sql-server sql-server-2008 tsql join