内连接:内连接不同表中的值之和,两边都没有命中时为0

Posted

技术标签:

【中文标题】内连接:内连接不同表中的值之和,两边都没有命中时为0【英文标题】:Inner Join: Sum of values in different tables with inner join and 0 when no hit on both sides 【发布时间】:2019-12-10 11:59:20 【问题描述】:

我使用 MS-SQL 并有以下两个表,我想在其中提取值以在一个 SQL 查询中创建第三个表。

这里的答案对我有帮助,但还不够。

sql sum data from multiple tables

对我来说同样重要的是,当没有注销或没有注册但注销(错误地)时,我必须为此获得值 0,因此我还需要在两个表中都没有命中的结果,但是只有一个。

是否有可能在一个 SQL 查询中得到这个结果?

注册

[ATE]   [Article]  [Description] [Registered]     
------------------------------------------
[1111]  [MS1234]      [SCREW]     [500]  
[2222]  [MS1234]      [SCREW]     [600]  
[2222]  [AB9999]       [BOLT]     [100]  
[3333]  [XYZ123]      [PAINT]     [900]  
[4444]  [LMU232]       [TOOL]     [120]  

DEREG

[ATE]   [Article]  [Description] [Deregistered]     
------------------------------------------
[1111]  [MS1234]      [SCREW]     [260]  
[3333]  [XYZ123]      [PAINT]     [900]  
[4444]  [LMU232]       [TOOL]      [20]  
[9999]  [TUM933]       [SHIM]    [5000]

RES

[ATE]   [Article]  [Description] [Registered] [Deregistered]    [Rest]
--------------------------------------------------------------------------
[1111]  [MS1234]      [SCREW]        [500]        [260]         [240]
[2222]  [MS1234]      [SCREW]        [600]          [0]         [600]
[2222]  [AB9999]       [BOLT]        [100]          [0]         [100]
[3333]  [XYZ123]      [PAINT]        [900]        [900]           [0]
[4444]  [LMU232]       [TOOL]        [120]         [20]         [100]
[9999]  [TUM933]       [SHIM]          [0]       [5000]       [-5000]

【问题讨论】:

你能告诉我们你到目前为止所做的尝试吗?以及为什么它不起作用。 【参考方案1】:

在 SQL Server 中,您可以full outer join 获取来自两个表的记录:

select 
    coalesce(r.ate, d.ate) ate, 
    coalesce(r.article, d.article) article, 
    coalesce(r.description, d.description) description, 
    coalesce(r.registered, 0) registered,
    coalesce(d.deregistered, 0) deregistered,
    coalesce(r.registered, 0) - coalesce(d.deregistered, 0) rest
from reg r
full outer join dereg d on d.ate = r.ate and d.article = r.article

Demo on DB Fiddle

吃了|文章 |描述 |已注册 |注销|休息 ---: | :-------- | :------------ | ---------: | ------------: | ----: 1111 | MS1234 |螺丝 | 500 | 260 | 240 第2222章MS1234 |螺丝 | 600 | 0 | 600 第2222章AB9999 |螺栓 | 100 | 0 | 100 第3333章XYZ123 |油漆 | 900 | 900 | 0 4444 | LMU232 |工具 | 120 | 20 | 100 9999 | TUM933 |垫片 | 0 | 5000 | -5000

【讨论】:

不幸的是,我收到消息“sql missing operator in query expression 'coalesce(r.ate, d.ate) ate' @ManfredSinger:我刚刚修正了一个错字(缺少逗号),现在可以使用了吗? 我已经看到这个并用逗号尝试过,但它不起作用。 @ManfredSinger:这似乎工作正常。我在答案中添加了一个 db fiddle 供您参考。您使用的是 ms-access(错误消息似乎表明)还是 sql-server(您用它标记了问题)? full join 在 ms-access 中不受支持。 在这种情况下,我使用 ODBC for Excel。内连接有效,但不是完全外连接

以上是关于内连接:内连接不同表中的值之和,两边都没有命中时为0的主要内容,如果未能解决你的问题,请参考以下文章

SQL内连接与外连接的区别

与内连接相反

如何将一个表与另一个表中的一系列值连接起来?

通过内连接从不同的表中检索值

左外连接和右外连接的区别

SQL中内连接使用详细说明