Sql 如何合并具有不同列的两个表
我有两张桌子叫A桌和B桌,就像下面的一样 表ASql 如何合并具有不同列的两个表,sql,Sql,我有两张桌子叫A桌和B桌,就像下面的一样 表A +-------+------------+------+---------+-----+ |MonthId|DepartmentId|Salary|Deduction| Paid| +-------+------------+------+---------+-----+ |01/2016| DEP01 | 1000 | 100 | 900| |01/2016| DEP02 | 2000 | 50 | 19
+-------+------------+------+---------+-----+
|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'的数据时,我不想显示空值。所以请显示您期望的结果。。说得非常清楚。(我认为你想加入,而不是像下面丹和卡姆兰建议的那样加入工会),但除非你公布你的预期结果,否则我无法确定。)谢谢你,兄弟,可能是我的问题不清楚,因为我的英语不好(我真的很抱歉)。但戈登·林诺夫先生的答案正是我想要的。谢谢你,兄弟,这正是我想要的,并给出了我真正需要的结果。