0

我需要查询具有相同列但内容不同的不同表。

表 A:

ID   DocDate     Type
1   2013-05-01    A
2   2013-05-01    B
3   2013-05-02    D
4   2013-05-04    D

表 B:

ID   DocDate     Type
1   2013-05-01    F
2   2013-05-03    G
3   2013-05-03    G
4   2013-05-05    H

我需要的:

COUNT(Tablea.ID)  COUNT(Tableb.ID) DocDate
      2                   1      2013-05-01
      1                  NULL    2013-05-02
     NULL                 2      2013-05-03
      1                  NULL    2013-05-04
     NULL                 1      2013-05-05

任何帮助将非常感激。

4

2 回答 2

0

尝试

SELECT d.docdate, a.total totala, b.total totalb
  FROM
(
  SELECT docdate 
    FROM tablea
   UNION
  SELECT docdate 
    FROM tableb
) d LEFT JOIN 
(
  SELECT docdate, COUNT(*) total
    FROM tablea
   GROUP BY docdate
) a ON d.docdate = a.docdate LEFT JOIN
(
  SELECT docdate, COUNT(*) total
    FROM tableb
   GROUP BY docdate
) b ON d.docdate = b.docdate
 ORDER BY d.docdate

输出:

| 文档日期 | 道达尔 | 总计|
--------------------------------
| 2013-05-01 | 2 | 1 |
| 2013-05-02 | 1 | (空) |
| 2013-05-03 | (空) | 2 |
| 2013-05-04 | 1 | (空) |
| 2013-05-05 | (空) | 1 |

这是SQLFiddle演示

于 2013-07-26T04:09:45.380 回答
0

有几种方法可以得到这个结果。

返回指定行的最有效查询可能是:

SELECT NULLIF(SUM(c.cnt_a_id),0) AS cnt_a_id
     , NULLIF(SUM(c.cnt_b_id),0) AS cnt_b_id
     , c.DocDate
  FROM (
         SELECT COUNT(a.ID) AS cnt_a_id
              , 0           AS cnt_b_id 
              , a.DocDate   AS DocDate
           FROM Table_A a
          GROUP BY a.DocDate
          UNION ALL
         SELECT 0
              , COUNT(b.ID)
              , b.DocDate
           FROM Table_B b
          GROUP BY b.DocDate
       ) c
 GROUP BY c.DocDate

每个表上合适的覆盖索引(DocDate, ID)将有利于大型集合的性能。

另一个更容易理解但成本更高的方法是创建表的 UNION,然后执行 GROUP BY。

SELECT NULLIF(COUNT(c.a_id)) AS cnt_a_id
     , NULLIF(COUNT(c.b_id)) AS cnt_b_id
     , c.DocDate
  FROM (
         SELECT a.ID       AS a_id
              , NULL + 0   AS b_id
              , a.DocDate  AS DocDate
           FROM Table_A a
          UNION ALL
         SELECT NULL + 0   AS a_id
              , b.ID       AS b_id
              , b.DocDate  AS DocDate
           FROM Table_B b
       ) c
 GROUP BY c.DocDate

(第二个查询效率较低,因为 MySQL 将内联视图中的查询具体化为临时 MyISAM 表的方式;第二个查询基本上创建了连接在一起的 Table_A 和 Table_B 的副本,并针对它运行查询。

第一个查询几乎没有什么不同,因为它产生了要连接在一起的更小的集合。

于 2013-07-26T04:11:17.460 回答