查询无重合三表连接

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;

【讨论】:

以上是关于查询无重合三表连接的主要内容,如果未能解决你的问题,请参考以下文章

MySQL多表查询 三表查询 连接查询的套路

sql多表链接之三表连接查询

MySQL三表查询

mysql三表联合查询问题

mysql三表联合查询

MySql的join(连接)查询 (三表 left join 写法)