使用 SQL Server “检查空间中的容量可用性”

Posted

技术标签:

【中文标题】使用 SQL Server “检查空间中的容量可用性”【英文标题】:"Check capacity availability in spaces" with SQL Server 【发布时间】:2016-11-25 16:57:07 【问题描述】:

我有一个仓库,货架上有方形空间,用于放置我的相同尺寸和装在盒子里的产品。

货架上的空间大小不一,我最多可以放置 X 个盒装产品。空间的大小可以是可变的。出于这个原因,我有一个表空间,其中有一列 MaximumCapacity

我正在尝试在系统中映射这些空间,以了解是否仍有可用容量并快速解决我的空间可以容纳另一个盒装产品的机架。这可以表示仓库的层次结构

+ Warehouse (1 warehouse)
  + Racks (5 000 racks)
     + Spaces (10 000 spaces)
         + Products (1 to N per space)

我一直在尝试做一个 SQL Server 2008 视图来获取我的空间与产品。

我有一个带有 MaximumCapacity 列的空间表,用于指定其中可以存放多少产品。我还有另一张桌子叫ProductLocation

我正在执行左连接以首先检索我的空间及其所有分配或产品位置。

SELECT 
    s.ID, s.Code,
    s.MaximumCapacity,
    pl.ProductCode
FROM 
    Space s
LEFT JOIN 
    ProductLocation pl ON s.ID = pl.SpaceID

这正在返回类似的东西

Code    - Maximum capacity - ProductCode
-----------------------------------------
SPACE 1 -         4        - PRODUCT1
SPACE 1 -         4        - PRODUCT2
SPACE 2 -         8        - PRODUCT3
SPACE 3 -         2        - PRODUCT4
SPACE 3 -         2        - PRODUCT5

这些数据将在 C# 中以更好的方式重新排列,但重点是,为了避免网络流量用于检索没有更多空间用于产品的空间,我只想检索具有可用容量的记录。我一直试图弄清楚但没有成功。在结果示例中,SPACE3 的最大容量为 2,并且已经有 2 个产品(PRODUCT4 和 PRODUCT5)。

我如何根据空间的最大容量过滤(WHERE)以避免这 2 行最后得到这个:

Code    - Maximum capacity - ProductCode
-----------------------------------------
SPACE 1 -         4        - PRODUCT1
SPACE 1 -         4        - PRODUCT2
SPACE 2 -         8        - PRODUCT3

我在没有更多空间的情况下检索所有不必要的空间时遇到性能问题。

提前致谢。

【问题讨论】:

ProductLocation 表中的每个产品是否正好占用 1 个空间?如果不是,那么它占用的空间量是如何确定的? 空间配置了最大容量,比如说 3。然后 ProductLocation 代表该容量空间的一部分。因此,如果我在 ProductLocation 中添加 2 个产品,我将有空间容纳另外 1 个产品。如果我再添加 1 个产品。产品数量 = 3 vs 空间容量 = 3,则将跳过行。 所以,是吗? ProductLocation 中的每个产品/行恰好占用 Space 表中 MaximumCapacity 的一个空间? 没错。一开始我误解了你的问题。 【参考方案1】:

请试试这个。

declare @Space table (ID int, Code varchar(20), MaximumCapacity int)
declare @ProductLocation table(SpaceID int, ProductCode varchar(20))

insert into @Space values
(1, 'Space 1', 4)
,(2, 'Space 2', 8)
,(3, 'Space 3', 2)
insert into @ProductLocation values
(1, 'Product1')
,(1, 'Product2')
,(2, 'Product3')
,(3, 'Product4')
,(3, 'Product5');

统计每个空间的产品数量,并排除那些小于最大值的产品。

with cte as(
SELECT s.ID,
  s.Code,
  s.MaximumCapacity,
  pl.ProductCode,
  count(pl.SpaceID) over(partition by pl.spaceid) as ProductCount
FROM @Space s
LEFT JOIN @ProductLocation pl ON s.ID = pl.SpaceID

)select ID, Code, MaximumCapacity, ProductCode from cte
Where ProductCount<MaximumCapacity

【讨论】:

【参考方案2】:

这应该可以解决问题

declare @space table (spaceid int, maximumCapacity int);

insert into @space values(1,4);
insert into @space values(2,8);
insert into @space values(3,2);

declare @productlocation table (productcode varchar(10), spaceid int);

insert into @productlocation values ('product1', 1);
insert into @productlocation values ('product2', 1);
insert into @productlocation values ('product3', 2);
insert into @productlocation values ('product4', 3);
insert into @productlocation values ('product5', 3);

with cte as (
    select spaceid,
        count(*) productcount
    from @productlocation
    group by spaceid
)
select s.spaceid, maximumCapacity, productcode
from @space s
inner join cte on s.spaceid = cte.spaceid
inner join @productlocation p on s.spaceid = p.spaceid
where cte.productcount < s.maximumCapacity

【讨论】:

以上是关于使用 SQL Server “检查空间中的容量可用性”的主要内容,如果未能解决你的问题,请参考以下文章

sql server 数据库换行符怎么使用

如何使用 Windows 和 SQL 身份验证使用 SQL Server Management Studio 连接到 SQL Server

SQL Server代理(8/12):使用SQL Server代理外部程序

如何使用sql server数据库中的标量值函数

Sql Server 游标操作的例子,使用sql server 游标循环处理数据

您如何使用 SQL Server CE 和 SQL Server 2008 Express?