如何连接仍保留主表中所有值的表

Posted

技术标签:

【中文标题】如何连接仍保留主表中所有值的表【英文标题】:how to join table that still retain all values from the main table 【发布时间】:2016-01-02 03:38:03 【问题描述】:

我有 3 个表,但现在我只使用 2 个进行测试

帐户表

         id     accnt      amount       date
        ---------------------------------------
         1       xxx        10.00      1/1/2016
         2       yyy        20.00      1/1/2016
         3       zzz        30.00      1/1/2016

已发行表

         id     accnt      issued       dateIssue
        ------------------------------------------
         1       xxx        5.00        1/10/2016
         1       xxx        5.00        2/14/2016
         2       yyy       10.00        2/15/2016  

我希望结果看起来像这样......如果在一月份

        id     accnt       amount    issued    balance  
      -------------------------------------------------
         1      xxx         10.00     5.00      5.00
         2      yyy         20.00     0.00     20.00
         3      zzz         30.00     0.00     30.00

如果是在二月

       id     accnt        amount    issued    balance
      -------------------------------------------------
        1       xxx         10.00     10.00     0.00
        2       yyy         20.00     10.00    10.00
        3       zzz         30.00      0.00    30.00

这是我提出的查询

       SELECT   AccntTbl.id, AccntTbl.accnt, AccntTbl.amount, 
                SUM(IssuedTbl.issued) as issued 
       FROM     AccntTbl LEFT JOIN IssuedTbl 
       ON       AccntTbl.id = IssuedTbl.id
       WHERE    (MONTH(IssuedTbl.dateIssue BETWEEN 1 AND 2)) AND
                (YEAR(AccntTbl.date)= 2016)
       GROUP BY AccntTbl.id, AccntTbl.accnt, AccntTbl.amount

但结果不是我所期望的,只有来自 1 & 2 的 id 会从结果中显示出来。我想显示 AccntTbl 中的所有值及其来自 IssuedTbl 的值。很高兴得到任何帮助。 .tnx :)

【问题讨论】:

【参考方案1】:

当您使用LEFT OUTER JOIN 并且想要从Right 表中过滤一些记录时,您需要将右表filter 移动到ON 条件否则@ 987654323@ 将隐式转换为INNER JOIN

简而言之,WHERE 子句reject 带有NULL 的行,这些行由LEFT OUTER JOIN 生成,用于不匹配的记录

SELECT A.id, 
       A.accnt, 
       A.amount, 
       Sum(I.issued) AS issued 
FROM   accnttbl A
       LEFT JOIN issuedtbl I
              ON A.id = I.id 
                 AND Month(I.dateissue) BETWEEN 1 AND 2 -- Right table filter
WHERE  Year(A.date) = 2016 
GROUP  BY A.id, 
          A.accnt, 
          A.amount 

【讨论】:

我会试试那个 mate..tnx :) 我在该查询中添加了另一个表......使用相同的过滤器......结果不是我期待的......为什么会这样?

以上是关于如何连接仍保留主表中所有值的表的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark SQL:在数据透视表中保留只有空值的条目

如何保留使用多个连接的密钥?

sql中的键是不是仍会保留在视图中

仅保留审计表中每个对象的最后 5 行

在访问中使用表单添加新记录时如何在表单字段中保留公式

加入一个包含桥表的表并从主表中获取数据,如果数据存在于桥表中,那么也可以获取它