Sql 如何合并具有不同列的两个表

Sql 如何合并具有不同列的两个表,sql,Sql,我有两张桌子叫A桌和B桌,就像下面的一样 表A +-------+------------+------+---------+-----+ |MonthId|DepartmentId|Salary|Deduction| Paid| +-------+------------+------+---------+-----+ |01/2016| DEP01 | 1000 | 100 | 900| |01/2016| DEP02 | 2000 | 50 | 19

我有两张桌子叫A桌和B桌,就像下面的一样

表A

+-------+------------+------+---------+-----+
|MonthId|DepartmentId|Salary|Deduction| Paid|
+-------+------------+------+---------+-----+
|01/2016|    DEP01   | 1000 |     100 |  900|
|01/2016|    DEP02   | 2000 |      50 | 1950|
|01/2016|    DEP03   | 1500 |       0 | 1500|
|       |            |      |         |     |
|02/2016|    DEP01   | 1000 |     100 |  900|
|02/2016|    DEP02   | 2000 |      50 | 1950|
|02/2016|    DEP03   | 1500 |       0 | 1500|
+-------------------------------------------+
表B

+-------+------------+------+---------+-----+------+------+
|MonthId|DepartmentId|Salary|Deduction| Paid|Bank_1|Bank_2|
+-------+------------+------+---------+-----+------+------+
|01/2016|    DEP01   | 1000 |     100 |  900|  400 |  500 |
|01/2016|    DEP02   | 2000 |      50 | 1950| 1400 |  550 |
|01/2016|    DEP03   | 1500 |       0 | 1500|    0 | 1500 |
+---------------------------------------------------------+
所以当我试着

SELECT MonthId, DepartmentId, Salary, Deduction, Paid, Null AS Bank_1, Null AS Bank_2
FROM Table_A 
WHERE MonthId = '02/2016'

UNION

SELECT MonthId, DepartmentId, Salary, Deduction, Paid, Bank_1, Bank_2
FROM Table_B 
WHERE MonthId = '02/2016'
其中MonthId='2016年2月'

我得到了我所需要的,但当我尝试

SELECT MonthId, DepartmentId, Salary, Deduction, Paid, Null AS Bank_1, Null AS Bank_2
FROM Table_A 
WHERE MonthId = '02/2016'

UNION

SELECT MonthId, DepartmentId, Salary, Deduction, Paid, Bank_1, Bank_2
FROM Table_B 
WHERE MonthId = '02/2016'
其中MonthId='01/2016'

我得到了下面的结果。所以请帮我解决这个问题

+-------+------------+------+---------+-----+------+------+
|MonthId|DepartmentId|Salary|Deduction| Paid|Bank_1|Bank_2|
+-------+------------+------+---------+-----+------+------+
|01/2016|    DEP01   | 1000 |     100 |  900| NULL | NULL |
|01/2016|    DEP01   | 1000 |     100 |  900|  400 |  500 |
|01/2016|    DEP02   | 2000 |      50 | 1950| NULL | NULL |
|01/2016|    DEP02   | 2000 |      50 | 1950| 1400 |  550 |
|01/2016|    DEP03   | 1500 |       0 | 1500| NULL | NULL |
|01/2016|    DEP03   | 1500 |       0 | 1500|    0 | 1500 |
+---------------------------------------------------------+

我怀疑你想要:

SELECT MonthId, DepartmentId, Salary, Deduction, Paid, MAX(Bank_1), MAX(Bank_2)
FROM (SELECT MonthId, DepartmentId, Salary, Deduction, Paid, Null AS Bank_1, Null AS Bank_2
      FROM Table_A 
      WHERE MonthId = '02/2016'
      UNION ALL
      SELECT MonthId, DepartmentId, Salary, Deduction, Paid, Bank_1, Bank_2
      FROM Table_B 
      WHERE MonthId = '02/2016'
     ) ab
GROUP BY MonthId, DepartmentId, Salary, Deduction, Paid;

我认为
左连接应该可以:

样本数据:

    CREATE TABLE #Table_A (MonthId VARCHAR(10), DepartmentId varchar(10), Salary int ,Deduction int, Paid int)
INSERT INTO #Table_A
VALUES
('01/2016','DEP01','1000','100','900'),
('01/2016','DEP02','2000','50','1950'),
('01/2016','DEP03','1500','0','1500'),
('02/2016','DEP01','1000','100','900'),
('02/2016','DEP02','2000','50','1950'),
('02/2016','DEP03','1500','0','1500')

CREATE TABLE #Table_B (MonthId  VARCHAR(10), DepartmentId varchar(10), Salary int ,Deduction int, Paid int, Bank_1 int ,Bank_2 int )
INSERT INTO #Table_B
VALUES
('01/2016','DEP01','1000','100','900','400','500'),
('01/2016','DEP02','2000','50','1950','1400','550'),
('01/2016','DEP03','1500','0','1500','0','1500')
使用WHERE子句进行查询:

SELECT  A.MonthId, 
       A.DepartmentId, 
       A.Salary, 
       A.Deduction, 
       A.Paid, 
       B.Bank_1, 
       B.Bank_2
FROM       #Table_A AS A LEFT OUTER JOIN 
       #Table_B AS B ON A.MonthId = B.MonthId AND 
                    A.DepartmentId = B.DepartmentId AND 
                    A.Salary = B.Salary AND 
                    A.Deduction = B.Deduction AND 
                    A.Paid = B.Paid
WHERE A.MonthId = '01/2016'
SELECT  A.MonthId, 
       A.DepartmentId, 
       A.Salary, 
       A.Deduction, 
       A.Paid, 
       B.Bank_1, 
       B.Bank_2
FROM       #Table_A AS A LEFT OUTER JOIN 
       #Table_B AS B ON A.MonthId = B.MonthId AND 
                    A.DepartmentId = B.DepartmentId AND 
                    A.Salary = B.Salary AND 
                    A.Deduction = B.Deduction AND 
                    A.Paid = B.Paid
结果:

不带WHERE子句的查询:

SELECT  A.MonthId, 
       A.DepartmentId, 
       A.Salary, 
       A.Deduction, 
       A.Paid, 
       B.Bank_1, 
       B.Bank_2
FROM       #Table_A AS A LEFT OUTER JOIN 
       #Table_B AS B ON A.MonthId = B.MonthId AND 
                    A.DepartmentId = B.DepartmentId AND 
                    A.Salary = B.Salary AND 
                    A.Deduction = B.Deduction AND 
                    A.Paid = B.Paid
WHERE A.MonthId = '01/2016'
SELECT  A.MonthId, 
       A.DepartmentId, 
       A.Salary, 
       A.Deduction, 
       A.Paid, 
       B.Bank_1, 
       B.Bank_2
FROM       #Table_A AS A LEFT OUTER JOIN 
       #Table_B AS B ON A.MonthId = B.MonthId AND 
                    A.DepartmentId = B.DepartmentId AND 
                    A.Salary = B.Salary AND 
                    A.Deduction = B.Deduction AND 
                    A.Paid = B.Paid
结果(您在2016年2月的第1行和第2行中没有任何值,因为表B中没有该月份的记录):


如果我猜对了,您需要表1中的所有值,以及Bank_1和Bank_2值(如果存在),那么看起来您应该使用左外连接而不是并集。这应该起作用:

SELECT A.MonthId, A.DepartmentId, A.Salary, A.Deduction, A.Paid, B.Bank_1, B.Bank_2
FROM Table_A AS A
LEFT OUTER JOIN Table_B AS B
ON A.MonthId = B.MonthId
AND A.DepartmentId = B.DepartmentId
WHERE A.MonthId = '02/2016'   

您希望得到什么结果?我尝试的是通过sql视图生成一个crystal报表。当我试图获取'01/2016'的数据时,我不想显示空值。所以请显示您期望的结果。。说得非常清楚。(我认为你想加入,而不是像下面丹和卡姆兰建议的那样加入工会),但除非你公布你的预期结果,否则我无法确定。)谢谢你,兄弟,可能是我的问题不清楚,因为我的英语不好(我真的很抱歉)。但戈登·林诺夫先生的答案正是我想要的。谢谢你,兄弟,这正是我想要的,并给出了我真正需要的结果。