这是方案
表收入有以下列
ID Inc_amt Trans_date
1 100 9/24/2014
2 200 9/24/2014
3 300 9/25/2015
表费用有以下栏目
ID exp_amt Trans_date
2 100 9/24/2014
3 200 9/24/2014
4 400 9/25/2014
我需要的是,对于trans_date = 9/24/2014,我需要以下输出。这里ID是两个表的公共密钥
ID inc_amt exp_amt trans_date
1 100 null 9/24/2014
2 200 100 9/24/2014
3 null 200 9/24/2014
我很困惑加入做什么。我能够获得匹配和不匹配的行,但是当我添加日期检查条件时,它只为9/24/2014的日期提供匹配的行
答案 0 :(得分:0)
您需要将两个表连接到一个基表,该表具有来自两个表的id。 当你离开加入一个表时,它将加入任何现有的id,所以你需要联合两个表来获取所有id然后加入它们,然后按日期过滤。
这样的事情
SELECT t.id, i.inc_amt, e.exp_amt, t.trans_date
FROM
( SELECT id, trans_date FROM income
UNION
SELECT id, trans_date FROM expense
) t
LEFT JOIN income i ON i.id = t.id AND i.trans_date = '9/24/2014'
LEFT JOIN expense e ON t.id = e.id AND e.trans_date = '9/24/2014'
WHERE t.trans_date = '9/24/2014';
+----+---------+---------+------------+
| id | inc_amt | exp_amt | trans_date |
+----+---------+---------+------------+
| 1 | 100 | null| 9/24/2014 |
| 2 | 200 | 100 | 9/24/2014 |
| 3 | null| 200 | 9/24/2014 |
+----+---------+---------+------------+
答案 1 :(得分:0)
这可以通过联合所有收入左外连接和条件右外连接来实现。
SELECT inc.id
,inc.inc_amt
,exp.exp_amt
,inc.trans_date
FROM income inc
LEFT OUTER JOIN expense exp ON inc.id = exp.id
WHERE (inc.trans_date = '2014-09-24')
UNION ALL
(
SELECT exp.id
,CASE
WHEN inc.trans_date <> '2014-09-24'
THEN NULL
END
,exp.exp_amt
,exp.trans_date
FROM income inc
RIGHT OUTER JOIN expense exp ON inc.id = exp.id
WHERE (
exp.trans_date = '2014-09-24'
AND inc.trans_date <> '2014-09-24'
)
)
ORDER BY id;
链接到sqlfiddle