这是我的情况:
我有两个表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给予帮助和耐心。
答案 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),则可以指定所需的值,而不是通配符*