MySQL合并两个表的结果

时间:2018-08-27 16:16:24

标签: mysql sql database join

这是我的情况:

我有两个表A和B,并且想要合并A和B的结果。 也许用单词来解释比较复杂,但是用表格结果来说明它更容易理解。

表A的代码

CREATE TABLE `A` (
  `id_doc_a` int(11) NOT NULL AUTO_INCREMENT,
  `subject_a` varchar(100) DEFAULT NULL,
  `doc_nr_a` varchar(100) NOT NULL,
  `doc_type_a` varchar(50) NOT NULL,
  `doc_date_a` date NOT NULL,
  `value_IN` varchar(50) NOT NULL,
  PRIMARY KEY (`id_doc_a`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

表B的代码

CREATE TABLE `B` (
  `id_doc_b` int(11) NOT NULL AUTO_INCREMENT,
  `subject_b` varchar(100) DEFAULT NULL,
  `doc_nr_b` varchar(100) NOT NULL,
  `doc_type_b` varchar(50) NOT NULL,
  `doc_date_b` date NOT NULL,
  `value_OUT` varchar(50) NOT NULL,
  PRIMARY KEY (`id_doc_b`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

我想选择所有具有值(例如JOHN)的subject_a和subject_b,并在具有列的单个表中合并:

| SUBJECT | DOC_NR | DOC_TYPE | DOC_DATE    | TBL_A_VALUE_IN | TBL_B_VALUE_OUT |
|---------|--------|----------|-------------|----------------|-----------------|
| JOHN    | 1      | PDF      | 20018-03-16 | 50.00          | NULL OR 0.00    |
| JOHN    | 33     | PDF      | 20018-08-09 | 25.00          | NULL OR 0.00    |
| JOHN    | 13     | PDF      | 20018-07-29 | 32.50          | NULL OR 0.00    |
| JOHN    | 4      | PDF      | 20018-06-06 | 41.30          | NULL OR 0.00    |
| JOHN    | 12     | JPEG     | 20018-04-22 | NULL OR 0.00   | 78.20           |
| JOHN    | 31     | JPEG     | 20018-03-21 | NULL OR 0.00   | 6.50            |
| JOHN    | 33     | JPEG     | 20018-05-01 | NULL OR 0.00   | 26.99           |

前4行是表A的结果,后3行是表B的结果,条件是SUBJECT(subject_a = subject_b)= JOHN。

希望解释得很好,谢谢您的帮助。


解决方案:感谢@scaisEdge

 SELECT 
     t.SUBJECT_NAME, 
     t.DOCUMENT_NR, 
     t.DOCUMENT_TYPE, 
     t.DOCUMENT_DATE, 
     t.TBL_A_VALUE_IN, 
     t.TBL_B_VALUE_OUT
FROM (
     SELECT 
           SUBJECT_a AS SUBJECT_NAME, 
           DOC_NR_a AS DOCUMENT_NR, 
           DOC_TYPE_a AS DOCUMENT_TYPE, 
           DOC_DATE_a AS DOCUMENT_DATE,
           VALUE_IN AS TBL_A_VALUE_IN, 
           NULL AS TBL_B_VALUE_OUT
     FROM a 
  UNION ALL
     SELECT  
           SUBJECT_b AS SUBJECT_NAME, 
           DOC_NR_b AS DOCUMENT_NR, 
           DOC_TYPE_b AS DOCUMENT_TYPE, 
           DOC_DATE_b AS DOCUMENT_DATE,
           NULL AS TBL_A_VALUE_IN,
           VALUE_OUT AS TBL_B_VALUE_OUT
     FROM b
) T 
  WHERE t.SUBJECT_NAME = 'john'
  ORDER BY t.DOCUMENT_DATE

我删除了0个tab_order和1个,并使用了别名,这样可以提高可读性。 为了可以在第一个选择中的一列中使用order并添加更多条件,只需使用AND即可;如果不需要NULL,我们可以在两个选择中使用0.00 AS而不是NULL AS。

再次感谢scaisEdge给予帮助和耐心。

2 个答案:

答案 0 :(得分:2)

您可以使用UNION ALL

   select   t.SUBJECT, t.DOC_NR, t.DOC_TYPE, t.DOC_DATE 
       , t.TBL_B_VALUE_IN,t.TBL_B_VALUE_OUT
    from (

    select   SUBJECT_a subject, DOC_NR_a DOC_NR, DOC_TYPE_a DOC_TYPE, DOC_DATE_a  DOC_DATE
         , VALUE_IN TBL_B_VALUE_IN, null TBL_B_VALUE_OUT , 0 tab_order 
    from table_a 
    union all
    select   SUBJECT_b, DOC_NR_b, DOC_TYPE_b, DOC_DATE_b , null,VALUE_OUT , 1  
    from table_b
    ) T 
    order by t.tab_order

答案 1 :(得分:0)

您可以只加入表。

SELECT *
FROM A
    JOIN B on A.subject_a = B.subject_b
WHERE A.subject_a = 'JOHN'

这会将两个数据集合并到一个结果表中。当然,如果您不想重复的值(即id_doc_a和id_doc_b),则可以指定所需的值,而不是通配符*