从2个表中检索匹配和不匹配的行

时间:2014-09-24 18:35:53

标签: mysql

这是方案

表收入有以下列

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的日期提供匹配的行

2 个答案:

答案 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;

enter image description here

链接到sqlfiddle