查询无重合三表连接
Posted
技术标签:
【中文标题】查询无重合三表连接【英文标题】:Query for join three tables without coincidences 【发布时间】:2020-09-26 13:26:24 【问题描述】:我的 ERP 中有三个表,我需要一个 SQL Server 查询来连接所有行。 这是我拥有的三个表及其属性,按产品代码 (SL.CodProduct = 'AL4301') 过滤以简化:
餐桌产品:
鳕鱼产品 DescProduct 家庭表股票:
鳕鱼产品 颜色 号码 库存单位表卖:
鳕鱼产品 售出日期 颜色 号码 售出单位我需要获取所有商品组合(颜色 - 编号)的列表,显示每月的销售额和当前的总库存。问题是某些商品组合没有销售。
我已经用这个查询试过了:
SELECT DatePart(mm, SELLS.DateSold) As Month,
SELLS.CodProduct, PRODUCTS.DescProduct,
SELLS.Color, SELLS.Number,
SUM(SELLS.UnitsSold,
(SELECT STOCKS.UnitsStock
FROM STOCKS WITH(NOLOCK)
WHERE STOCKS.CodProduct = SELLS.CodProduct
AND STOCKS.Color = SELLS.Color AND STOCKS.Number = SELLS.Number) As Stock
FROM SELLS WITH(NOLOCK)
JOIN PRODUCTS WITH (NOLOCK) ON PRODUCTS.CodProduct = SELLS.CodProduct
WHERE PRODUCTS.Family = 05 AND SELLS.CodProducto = 'AL4301'
GROUP BY DatePart(mm, SELLS.DateSold), SELLS.CodProduct, SELLS.DescProduct, SELLS.Color, SELLS.Number
ORDER BY SELLS.CodProduct, SELLS.Color, SELLS.Number
通过这个查询我得到这个:
但我需要得到这个:
感谢@Gordon Linoff,我得到了解决方案。最后我用了这个:
SELECT ST.CODPRODUCT, ST.DESPRODUCT, ST.COLOR, ST.NUMBER,
P.FAMILY, ST.UNITSSTOCK STOCK, SLL.MONTH, SLL.UNITSSOLD
FROM STOCKS ST
JOIN PRODUCTS P ON P.CODPRODUCT = ST.CODPRODUCT
LEFT OUTER JOIN
(SELECT SL.CODPRODUCT, SL.COLOR, SL.NUMBER,
DatePart(mm, SL.DATESOLD) MONTH,
SUM(SL.UNITSSOLD) UNITSSOLD
FROM SELLS SL
GROUP BY SL.CODPRODUCT, DatePart(mm, SL.DATESOLD),
SL.COLOR, SL.NUMBER) SLL
ON SLL.CODPRODUCT = ST.CODPRODUCT
AND SLL.COLOR = ST.COLOR
AND SLL.NUMBER = ST.NUMBER
ORDER BY ST.CODPRODUCT, ST.COLOR, ST.NUMBER
【问题讨论】:
我根据NOLOCK
的使用添加了SQL Server标签。没有理由使用NOLOCK
——除非你真的、真的知道你在做什么。但它建议使用 SQL Server。
请use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。
请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。
How to select from two tables in mysql even if not all rows in one table have corespondents in the other?
感谢您的来信。其实是查询sql server,专门针对一个ERP,不好意思一开始没提。我使用了“NOLOCK”,因为在我从 ERP 中看到的所有查询中,他们总是使用这个参数。我不是 100% 确定我是否应该使用它。
【参考方案1】:
使用cross join
生成股票和月份的所有组合。然后使用left join
和聚合:
select s.codproduct, s.color, s.number, year(v.month), month(v.month),
s.unitsstock, sum(sa.unitssold)
from stocks s cross join
(values ('2020-09-01')) v(month) left join
sales sa
on s.codproduct = sa.codproduct and
s.color = sa.color and
s.number = sa.number and
sa.datesold >= v.month and
sa.datesold < dateadd(month, 1, v.month)
group by s.codproduct, s.color, s.number, year(v.month), month(v.month),
s.unitsstock;
【讨论】:
以上是关于查询无重合三表连接的主要内容,如果未能解决你的问题,请参考以下文章