[英]How do I Union two tables with different columns
我有两个名为 Table_A 和 Table_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'
WHERE MonthId = '02/2016'
我得到了我需要的东西但是如果尝试
WHERE 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;
我认为LEFT JOIN
应该这样做:
样本数据:
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'
结果:
没有 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
结果(您在 02/2016 的 Bank_1 、Bank_2 中将没有任何值,因为 #Table_B 中没有该 MonthId 的记录):
看起来您应该使用 LEFT OUTER JOIN 而不是联合,如果我猜测您想要 table1 中的所有值,以及 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'
DECLARE @table1 VARCHAR(255) = 'table_A'
DECLARE @table2 VARCHAR(255) = 'table_B'
DECLARE @col1 VARCHAR(MAX) SELECT @col1 = COALESCE(@col1+',' ,'') + ISNULL(t.a, 'NULL as ' + t.b)
FROM
( SELECT
a.COLUMN_NAME as a
,b.COLUMN_NAME as b
FROM
(
SELECT
COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = @table1
) a
FULL JOIN
(
SELECT
COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = @table2
) b
ON a.COLUMN_NAME = b.COLUMN_NAME
) t
--SELECT @cl1
DECLARE @col2 VARCHAR(MAX) SELECT @col2 = COALESCE(@col2+',' ,'') + ISNULL(t.b, 'NULL as ' + t.a)
FROM
( SELECT
a.COLUMN_NAME as a
,b.COLUMN_NAME as b
FROM
(
SELECT
COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = @table1
) a
FULL JOIN
(
SELECT
COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = @table2
) b
ON a.COLUMN_NAME = b.COLUMN_NAME
) t
--SELECT @table2
DECLARE @DynSQL nvarchar(MAX) Set @DynSQL = 'SELECT ' + @col1 + ' FROM ' + @table1 + ' UNION ALL SELECT ' + @col2 + ' FROM ' + @table2
exec sp_executesql @DynSQL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.