如何连接仍保留主表中所有值的表
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 :) 我在该查询中添加了另一个表......使用相同的过滤器......结果不是我期待的......为什么会这样?以上是关于如何连接仍保留主表中所有值的表的主要内容,如果未能解决你的问题,请参考以下文章