【问题标题】:retrieve matching and non matching rows from 2 tables从 2 个表中检索匹配和不匹配的行
【发布时间】:2014-09-24 18:35:53
【问题描述】:

这里是场景

表收入有以下列

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

我对加入做什么感到困惑。我能够同时获得匹配和不匹配的行,但是当我添加日期检查条件时,它只会为 2014 年 9 月 24 日的日期提供匹配的行

【问题讨论】:

  • 这可能是您考虑在单个表中执行的操作,以便从长远来看更容易对数据进行聚合/计算。您可以轻松地创建一个金额列,其中包含代表费用的负金额或第二列来指示该项目是收入还是费用。

标签: mysql


【解决方案1】:

您需要将这两个表左连接到一个基表,该基表具有两个表中的 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  |
+----+---------+---------+------------+

【讨论】:

  • 谢谢。我会尽力让你知道
  • @RajeevNair 欢迎您!如果这解决了您的问题,如果您愿意ACCEPT 回答,我将不胜感激!我会回报 +1 :)
【解决方案2】:

这可以通过联合所有收入|费用左外连接和有条件的右外连接来实现。

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

【讨论】:

  • 你是如何测试代码的?我已经在本地测试过,它工作正常。我无法提供 sqlfiddle 链接,因为该网站本身已关闭! ideone 不支持右外连接 ..
  • 我在我的本地测试,它没有返回任何结果。 ://
猜你喜欢
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 2019-03-26
相关资源
最近更新 更多