SQL Server内部加入同一张表

Posted

技术标签:

【中文标题】SQL Server内部加入同一张表【英文标题】:SQL Server inner Join with the same table 【发布时间】:2018-02-04 14:20:10 【问题描述】:

我有一个库存表,可以计算出我在公司商店存储和主存储上分发的库存清单。现在我想分析一下,如果我在任何商店都有关键库存(这意味着少于 5 件商品)并且主存储中有足够的资源,我必须通过查询将商品运送到该商店。我有另一个主题,我可能会向主存储添加新项目,所以我的查询必须提醒我至少向每个商店发送 5 件。此外,如果我开了一家新商店(我将在该表中插入一个具有 NULL 模型、NULL 库存的新行),它必须列出第一天所需的库存。

谢谢。

(顺便说一句,我想在 SQL Server 2014 中这样做是为了个人开发而不是生产。过去 12 年我没有编写任何程序)。

更新:28/08/2017 10:42

对不起,如果我不能很好地解释我的问题。我像这样更新了我的参考表:dbo.stock

Referance Table 并像这样查询输出: Query Output

所以 - 我想检查是否所有商店的仓库中都有公司产品, 如果公司开了一家新店,我必须找到它,并且必须从所有产品中运送 5 件给它。

谢谢。

【问题讨论】:

请添加一个真实的表格样本以及到目前为止您尝试过的内容。 您的帖子似乎没有包含问题,只是一组描述您的股票算法的不完整陈述 我添加了我的预期输出和参考表。并想更好地描述我的问题。感谢您的帮助。 【参考方案1】:

每个商店的关键模型列表和库存中的主要资源(如果有的话)

select a.sloc, a.model, a.stock critical, isnull(b.stock,0) 'Main Resources'
from stock a left join stock b on a.model=b.model and b.sloc='Main'
where a.stock<5

对于您请求的最后一部分,我不确定新开的商店需要什么。

编辑

此过程至少可以满足您的需要,不是最佳的,但您可以稍后进行。

begin transaction

declare @initialStock int=5
declare @stockDecrease int=0

insert into stock (sloc, model, stock)
    select (select a.sloc
from stock a 
where a.stock is null) n, m.model, @initialStock
from stock m where m.sloc='Main'  
set @stockDecrease= @@ROWCOUNT/4*@initialStock

delete stock where stock is null

update stock 
set stock=stock-@stockDecrease
where sloc='Main' 

if exists (select 1 from stock where stock<0 and sloc='Main')
    rollback
else
    commit

【讨论】:

嗨,Horaciux,我更新了我的问题(我无法解释清楚的那部分)。感谢您的帮助。 你说的ship是什么意思,详细描述一下。您是否要通过空值识别新商店,在主 sloc(4 个模型)中插入新的匹配项目的行并更新新商店的库存并减少主商店的库存? 是的,正如你所说。 查看我的编辑。仅当主要股票保持正数时才提交此事务,否则将回滚 感谢您的更新。第一个和第二个代码都运行良好,但我意识到我对 sql 语言很差。获得第一次查询的结果后,如何更新我的关键股票?如果任何商店的任何型号的商品少于 5 件,并且我在主商店有足够的资源,我想更新它们。

以上是关于SQL Server内部加入同一张表的主要内容,如果未能解决你的问题,请参考以下文章

带有内部联接的 SQL Server 更新

SQL Server 中使用 Sum Aggregate 函数进行内部联接

sqlserver 的交叉连接和内部连接有啥区别吗?

SQL SERVER,一张表中,有多个字段关联另一张表,怎么写SQL语句?

如何比较同一张表(SQL Server)中的 2 行?

SQL Server:按分组列求和并按另一列排序